Никитенко Максим (Sets88)

Личная страница

Python - Видео с ActiveX видеорегистраторов

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

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

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

Первым делом нашел подходящий клиент для регистратора, подошел ASee+ под IOS и включил Wireshark:



Вижу пакет с авторизацией, то что нужно, беру содержимое пакета и сохраняю в файл. Чтобы не носиться с несколькими файлами, вынес этот файл внутрь программы, да и менять данные внутри этого пакета удобнее, например для того чтобы выбрать другую камеру на этом регистраторе.

Задумка такова:
— Подключаемся на порт
— Если происходит ошибка, выводим сообщение
— Шлем перехваченный пакет с авторизацией
— Принимаем поток
— Перенаправляем поток в mplayer

Исходный код
#! /usr/bin/python

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()
Яндекс.Метрика