Введение

Всем привет! Я работаю не в IT компании системным администратором. В перечень обязанностей входит и администрирование систем видеонаблюдения [мы используем CTV и HiWatch], это обычная ситуация админ должен уметь все и сразу.

Информацией в данной статьей я хочу поделиться в виду того, что потребовалось не мало времени для поиска решения задачи и написания небольшого скрипта. Если у кого будут предложения по иной реализации задач, буду рад ознакомиться.

Задача

  1. Организовать вывод видеонаблюдения с разных точек объекта на монитор в штабе, для постоянного контроля происходящего.(Строительная компания, на каждом объекте имеется штаб для ИТР состава.)

  2. Организовать видео-стену в офисе для контроля работы на объектах.

Соединение объектов

В данной статье не буду рассматривать способы обеспечения соединения с объектами, у нас поднят VPN на firewall zyxel, есть иной способ - пробросить порты, но понадобятся белые IP на всех объектах что очень накладно и настройка firewall для доступа с определенных адресов. По этому рекомендую настроить VPN в сети много мануалов.

Часть 1. Подготовка

Вывести изображение с видеорегистраторов можно несколькими способами:

  1. через приложения для смартфонов;

  2. На прямую видео кабелем (HDMI, VGA)

  3. софт для ПК;

  4. Браузер. (web-морда)

Мы будем рассматривать 4 вариант.

Вопрос остается в том как организовать автологин и прочие манипуляции в браузере, дабы не давать всем сотрудникам пароль, и не напрягать лишней работой, включил ПК и все работает.

У меня на момент выполнения задачи были базовые знания Python, С++ учил когда-то давно в универе. Выбор пал на Python так как системы с которых открывается вся история на Windows, С++ сложнее по синтаксису и давно не работал с ним, рассматривать реализацию на нем даже не стал.

В Python есть библиотека Selenium, позволяющая работать c браузерами, к сожалению Web-морды наших регистраторов корректно работают только в IE... И Selenium-у потребуется Web-driver, скачать можно с сайта библиотеки.

Ссылка на web-driver

Часть 2. Написание

Для удобства разработки использовал VS Code. (установку и настройку не буду рассматривать, информации в сети много)

  1. Создать окружение для разработки, для этого в оболочке PS следует ввести:

python -m venv hiwatch
cd hiwatch\Scripts
.\activate.ps1

Мы создаем окружение, переходим в папку Scripts и активируем его.

  1. Создаем файл .py и устанавливаем Selenium.

cd .. #переходим в каталог выше hiwatch\
touch video.py #создаем файл питона
pip3 install selenium #устанавливаем Selenium

так же качаем файл IE webdriver с сайта selenium (ссылка выше) и закидываем в папку hiwatch.

  1. Ниже будет предоставлен код из файла video.py с пояснением, для регистраторов Hiwatch & Hikvision.

#video.py

import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

time.sleep(60) #здесь и далее приостановка выполнения в секундах

drive = webdriver.Ie(executable_path = r'IEDriverServer.exe') #присваиваем переменной drive исполняемый файл webdriver-a

drive.get('http://192.168.*.*/') #IP адрес регистратора может быть указан номер порта

time.sleep(15)

drive.find_element(By.ID, 'username').send_keys('log') #Ваш логин к регистратору
drive.find_element(By.ID, 'password').send_keys("pass") #Ваш пароль к регистратору
drive.find_element(By.ID, 'password').send_keys(Keys.ENTER) #Иммитация нажатия Enter для перехода на следущую страницу

time.sleep(10)

search = drive.find_element(By.CLASS_NAME, 'icon-playall') #выбор кнопки воспроизведения изображения
drive.execute_script("arguments[0].click();", search) #иммитация нажатия

time.sleep(5)

full = drive.find_element(By.CLASS_NAME, 'icon-full') #выбор кнопки изображения на полный экран
drive.execute_script("arguments[0].click();", full) #иммитация нажатия

drive.close
drive.quit
  1. Ниже код из файла video.py для регистратора CTV.

import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

time.sleep(5) #здесь и далее приостановка выполнения в секундах

drive = webdriver.Ie(executable_path = r'IEDriverServer.exe') #присваиваем переменной drive исполняемый файл webdriver-a

drive.get('http://192.168.*.*/') #IP адрес регистратора может быть указан номер порта

time.sleep(10) 

drive.find_element(By.ID, 'txtUserName').send_keys('login')  #Ваш логин к регистратору
drive.find_element(By.ID, 'txtPassword').send_keys('Pass') #Пароль к регистратору
drive.find_element(By.ID, 'txtPassword').send_keys(Keys.ENTER) #Иммитация нажатия Enter для перехода на следущую страницу

time.sleep(10)

search1 = drive.find_element(By.ID, 'seg_selector') #открытие вкладки для выбора сетки отображения
drive.execute_script("arguments[0].click();", search1) #иммитация нажатия
search2 = drive.find_element(By.ID, 'seg_9') #выбор сетки 3*3
drive.execute_script("arguments[0].click();", search2) #иммитация нажатия

time.sleep(5)

full = drive.find_element(By.ID, 'full_screen') #выбор кнопки изображения на полный экран
drive.execute_script("arguments[0].click();", full) #иммитация нажатия

drive.close 
drive.quit 
  1. Перегоняем программу из .PY в .EXE для запуска на разных хостах без установки Python и прочего, получим самостоятельную программу.

pyinstaller --noconfirm --onedir --console --add-data "C:/Users/!Ваш путь к этой папке!/IEDriverServer.exe;." "C:/Users/!Ваш путь к этой папке!/video.py"
  1. Сборка содержится в папке dist, которая находится в одной директории с папкой hiwatch.

Ссылка на мой git с уже готовыми проектами, следует указать некоторые данные в файле .py и перегнать в .EXE

Часть 3. Заключение

Вам остается только перенести результат из папки dist на любую машину.

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

Комментарии (28)


  1. JPEGEC
    12.06.2023 03:31

    Осталось за кадром как на экран броузера размещают картинки с разных объектов.

    Сам подход конечно достаточно странный, но работает же.


    1. LeoALecksey Автор
      12.06.2023 03:31

      Делал на 1 экран 1 регистратор, к машине цеплял 2 экрана и выводил на каждый по регистратору на 8 портов, но еще не разобрался как разнести на 2 экрана 2 вкладки браузера, дабы вручную этого не делать. Есть на Гите файл с открытием 2-х вкладок.

      А вывести с 2-х объектов можно используя 1 регистратор и маршрутизацию, у меня такая история с Hiwatch.


  1. reeshkov
    12.06.2023 03:31
    +1

    Я так понимаю, селениум умеет имитацию activeX? Вроде все эти регистраторы только через него в html страничках показывают, а те, которые умеют поток отдавать можно через ffmpeg или libvlc показывать.


    1. LeoALecksey Автор
      12.06.2023 03:31

      Затрудняюсь ответить, плагин для работы видео докачивать придется при первом входе с устройства. А вот этот момент "ffmpeg или libvlc" нужно посмотреть, не сталкивался.


      1. alexander222
        12.06.2023 03:31
        +1

        Запросы в гугл CTV rtsp и HiWatch rtsp дают адреса потоков на первой странице поиска. Воспроизвести можно например через mplayer, что бы просто запускать с консоли.


    1. serg-mizun
      12.06.2023 03:31
      +3

      Сейчас уже практически все регистраторы, да и камеры, отдают видео по rtsp. Запускаете vlc с адресом потока и смотрите картинку. Если вы с селениумом разобрались, то тут и подавно справитесь.


      1. 13werwolf13
        12.06.2023 03:31

        vlc mosaic весьма глючновато кстати, я как-то заморачивался. у меня было штук 5 регистраторов по 2-3 камеры, я забирал rtsp на каждую камеру и выводил мозайкой чтобы оператор мог всё видеть. проблем несколько:
        1) как мозайка собрана так и останется, нельзя приблизить одну из камер например
        2) жрёт cpu сильнее чем запуск такого же кол-ва отдельнозапущенных vlc
        3) если одна из камер перестала показывать по любой из причин то сама она уже не подхватится, надо перезапускать (хотя если без мозайки открыть поток то емнип vlc сам переподключался)

        правда всё это было ну очень давно, возможно сейчас ситуация стала сильно лучше


  1. Redwid
    12.06.2023 03:31
    +1

    Frigate умеет собирать видео с разных источников и показывать в одном окне. Не проще будет его использовать?


  1. TheHangedKing
    12.06.2023 03:31

    Когда не было денег на коробочный ip-видеорегистратор, я использовал ZoneMinder. Он может получать потоки в разных форматах, нужно было только нагуглить правильные ссылки на поток для каждой модели камеры. Приложение для Андроида под него тоже есть, называется ZMNinja. Выглядят они довольно топорно, но работают. Многомониторные конфигурации я не пробовал. Информация устарела на несколько лет.

    Как я понял из текста статьи, ваши видеорегистраторы тоже могут отдавать поток по ip, что вы и использовали.

    Погуглил сейчас opensource cctv, предложений много, но как всегда, нужно проверять, как они работают.


  1. datacompboy
    12.06.2023 03:31
    +2

    Таки я скажу что автоматизация видеонаблюдения должна включать в себя автоматизацию поиска аномалий. Человек не может эффективно пялиться в экран часами -- 99% времени интересное будет пропущено. Так что поиск аномалий -- первичен. Подсветк внезапного движения по необычным углам и/или по нестандартному марштуру даст больше.


    1. LeoALecksey Автор
      12.06.2023 03:31
      +1

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


  1. gigimon
    12.06.2023 03:31
    +1

    А почему не забирать картинку просто через rtsp поток? на HiWatch он есть


  1. morsmil
    12.06.2023 03:31

    Почему не использовали прямое подключение по rtsp к камерам?


  1. LeoALecksey Автор
    12.06.2023 03:31

    Отвечу сразу а несколько вопросов:

    1. С rtsp не сталкивался, и честно говоря не знал что можно было так вывести поток, спасибо всем за информацию, по возможности попробую.

    2. В ближайшем будущем планирую сделать еще дополнительные мониторинг соединения, так как есть проблема: при обрыве соединения вылетает регистратор и надо заново логиниться. Что бы в данном случае был мониторинг состояния и переподключение.

    3. Решил пойти таким путем, потому то не пришло в голову иное, да и опыт в написании чего либо на питоне стал не лишним и интересно было самому что то придумать и реализовать. Поделился со всеми, вдруг кому пригодиться информация да и ожидал что многие подскажут другие варианты решения, обмен опытом так же полезен, список того что нужно поизучать пополнился)


    1. Harwest
      12.06.2023 03:31
      +1

      Добавлю в список полезного go2rtc - комбайн агрегатор видеопотоков транскодер

      https://habr.com/ru/articles/724482/


      1. LeoALecksey Автор
        12.06.2023 03:31

        Спасибо!)


        1. jidckii
          12.06.2023 03:31

          Собираете потоки на стену для webrtc с помощью go2rtc или mediamtx.

          Если нужен ещё архив с них(go2rtc/mediamtx) забираете rtsp поток в yucca.app


  1. aMster1
    12.06.2023 03:31

    Сколько камер?

    Существуют бесплатные (если как бы хочется отделаться малой кровью) варианты нормальных систем видеонаблюдения с записью, просмотрами и прочими блекджеками.

    Например (ничуть не реклама) SecurOS lite. До 32 камер на одном сервере. Любые раскладки, интуитивное управление... У меня собраны куча объектов на один сервер, к нему подключен 1 арм с 2мя мониторами ( в принципе можно и на одном компе все крутить, но у меня разделено)


    1. LeoALecksey Автор
      12.06.2023 03:31

      согласен, получилось так, что было закуплено видеонаблюдение до меня (большая часть), стояли автономно на объектах, не было IT специалиста в организации. А уже когда пришел начал работать с тем что есть, и сеть объединять и т.д. Камер под 80 штук.


  1. AndreyUA
    12.06.2023 03:31

    Использую для видеонаблюдения trassir. Очень мощный софт. Есть поддержка автоматизации на python. Но, к сожалению, последние решения по ценообразованию вынуждают от него отказываться. Подскажите альтернативный софт.


    1. TheHangedKing
      12.06.2023 03:31

      Макроскоп был неплох. Цены не сравнивал.


      1. AnGord
        12.06.2023 03:31

        Макроскоп немного дешевле. Плюс есои нужна простая аналитика проще настраивается и меньше чудес с железом .

        Трассир гибче. Но дороже.


  1. Maksim4
    12.06.2023 03:31

    Зачем такие сложности, не проще использовать единое решение. Допустим купить ПО для видеонаблюдения допустим IP линия, ITV интеллект, Trassir, dominashion или любое другое.


    1. LeoALecksey Автор
      12.06.2023 03:31

      Так проше, но платно)


      1. Maksim4
        12.06.2023 03:31

        Это единая система, для организации это плюсы. Кто будет её поддерживать когда ты уволишься. Это не дорого, дорогой тут только ITV


  1. Dieul
    12.06.2023 03:31

    Почему бы не использовать requests вместо костыля со sleep ?


    1. LeoALecksey Автор
      12.06.2023 03:31

      Вы имеете в виду отправлять get запрос и если приходит 200 то продолжать?

      Выбор пал на sleep в тот момент когда скрипт кинул в автозагрузку и на старом ноуте он начинал работать (win 7), вылетала куча ошибок, потому как браузер не успевал открыться, потом долго открывал ссылки, переходил на странички.


  1. edgi
    12.06.2023 03:31

    Слегка не по теме. А вы vpn на объектах какой использовали? L2TP? Скорость проседает? я перешёл на wireguard.