Недавно поступила задача, необходимо организовать просмотр камер с видеорегистратора, вот только одна проблема, это всеми любимый activex регистратор, чтобы просмотреть камеры которого, необходим Internet Explorer, тут же другая проблема, в организации, которой я взялся помочь, на всех компьютерах используют Linux.
Кто хоть раз вникал в проблему воспроизведения видео с камер подобного видеорегистратора, поймет в чем тут загвоздка.
Облазил весь интернет, нигде ничего дельного не сказано.
Первым делом нашел подходящий клиент для регистратора, подошел ASee+ под IOS и включил Wireshark:

Вижу пакет с авторизацией, то что нужно, беру содержимое пакета и сохраняю в файл.
Чтобы не носиться с несколькими файлами, вынес этот файл внутрь программы, да и менять данные внутри этого пакета удобнее, например для того чтобы выбрать другую камеру на этом регистраторе.
Задумка такова:
— Подключаемся на порт
— Если происходит ошибка, выводим сообщение
— Шлем перехваченный пакет с авторизацией
— Принимаем поток
— Перенаправляем поток в mplayer
Исходный код:
Кто хоть раз вникал в проблему воспроизведения видео с камер подобного видеорегистратора, поймет в чем тут загвоздка.
Облазил весь интернет, нигде ничего дельного не сказано.
Первым делом нашел подходящий клиент для регистратора, подошел ASee+ под IOS и включил Wireshark:

Вижу пакет с авторизацией, то что нужно, беру содержимое пакета и сохраняю в файл.
Чтобы не носиться с несколькими файлами, вынес этот файл внутрь программы, да и менять данные внутри этого пакета удобнее, например для того чтобы выбрать другую камеру на этом регистраторе.
Задумка такова:
— Подключаемся на порт
— Если происходит ошибка, выводим сообщение
— Шлем перехваченный пакет с авторизацией
— Принимаем поток
— Перенаправляем поток в mplayer
Исходный код:
import socket
import sys
import subprocess
login = "admin"
passwd = "admin"
host = "111.222.222.111"
port = 6060
if len(sys.argv) > 1:
cameraid = chr(int(sys.argv[1]))
else:
print "Usage:\n%s camid" % sys.argv[0]
sys.exit()
auth = '\x00\x00\x00H\x00\x00\x00\x00(\x00\x04\x00\x05\x00\x00\x00)\x008\x00%s\x00\x00\x00\x00\x00\x00\x00\x00\x00\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%s\x00\x00' % (login.ljust(8, "\x00"), passwd.ljust(8, "\x00"), cameraid)
player_cmd = "mplayer -nocache -fps 3 -demuxer h264es -"
notify_cmd = "notify-send -t 1000"
class Camviewer(object):
def __init__(self, auth=auth, host=host, port=port):
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.settimeout(3)
self.connect(host, port)
self.send_msg(auth)
self.player_proc = subprocess.Popen(player_cmd.split(" "), stdin=subprocess.PIPE)
self.play()
def connect(self, host, port):
try:
self.sock.connect((host, port))
except (socket.error, socket.timeout) as e:
self.notify("Error", e.args[-1])
sys.exit()
def notify(self, header, body):
subprocess.call(notify_cmd.split(" ") + [header, body])
def send_msg(self, msg):
self.sock.send(msg)
def recive_msg(self, bcount=1500):
return self.sock.recv(bcount)
def play(self):
while 1:
buf = self.recive_msg()
if len(buf) == 0:
break
self.player_proc.stdin.write(buf)
if __name__ == "__main__":
Camviewer()