Хочу поделиться небольшим скриптом, написанным с целью получения видео-потока в h264 с видео-камер, серии HiIpcam из Content-Type: video/bubble.
На http-запрос curl -i '192.168.0.123/bubble/live?ch=0&stream=0
подобная камера как правило отвечает что-то похожее на:
HTTP/1.1 200 OK
Server:HiIpcam
Content-Type:video/bubble
Connection:keep-alive
<bubble version=»1.0″ vin=»1″><vin0 stream=»3″><stream0 name=»720p.264″ size=»1280×720″ x1=»yes» x2=»yes» x4=»yes» />
<stream1 name=»360p.264″ size=»640×360″ x1=»yes» x2=»yes» x4=»yes» />
<stream2 name=»qvga.264″ size=»320×240″ x1=»yes» x2=»yes» x4=»yes» />
<vin0>
Пара примеров как этим пользоваться:
# просмотр через mplayer ./ipcam.py | mplayer -fps 50 - # просмотр через ffplay ./ipcam.py | ffplay - # запись в файл ./ipcam.py > file.mp4
Ниже собственно сам скрипт.
Для корректной работы необходимо изменить 4 переменные, а именно:
ip-адрес видео-камеры, порт, если он отличается от стандартного, и пару логин/пароль.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
TCP_IP = ‘192.168.0.123’
TCP_PORT = 80
LOGIN=’login’
PASSW=’password’
import socket,sys
BUFFER_SIZE = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
s.send(«GET /bubble/live?ch=0&stream=0 HTTP/1.1\r\n\r\n»)
data = s.recv(BUFFER_SIZE)
BUFFER_SIZE = 4096
s.send(«\xaa\x00\x00\x00\x35\x00\x02\xd7\x0e\x7f\x00\x00\x00\x2c\x00\x00\x00\x00%s\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00%s\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00» % (LOGIN, PASSW))
data = s.recv(BUFFER_SIZE)
s.send(«\xaa\x00\x00\x00\x15\x0a\x02\xd7\x0f\x79\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00»)
data = s.recv(BUFFER_SIZE)
while data:
sys.stdout.write(data)
data = s.recv(BUFFER_SIZE)
s.close()