Search
Write a publication
Pull to refresh

Получаем видео с ActiveX видеорегистраторов

Недавно поступила задача, необходимо организовать просмотр камер с видеорегистратора, вот только одна проблема, это всеми любимый activex регистратор, чтобы просмотреть камеры которого, необходим Internet Explorer, тут же другая проблема, в организации, которой я взялся помочь, на всех компьютерах используют Linux.

Кто хоть раз вникал в проблему воспроизведения видео с камер подобного видеорегистратора, поймет в чем тут загвоздка.

Облазил весь интернет, нигде ничего дельного не сказано.

Первым делом нашел подходящий клиент для регистратора, подошел 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()

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.