Введение
Всем привет! Я работаю не в IT компании системным администратором. В перечень обязанностей входит и администрирование систем видеонаблюдения [мы используем CTV и HiWatch], это обычная ситуация админ должен уметь все и сразу.
Информацией в данной статьей я хочу поделиться в виду того, что потребовалось не мало времени для поиска решения задачи и написания небольшого скрипта. Если у кого будут предложения по иной реализации задач, буду рад ознакомиться.
Задача
Организовать вывод видеонаблюдения с разных точек объекта на монитор в штабе, для постоянного контроля происходящего.(Строительная компания, на каждом объекте имеется штаб для ИТР состава.)
Организовать видео-стену в офисе для контроля работы на объектах.
Соединение объектов
В данной статье не буду рассматривать способы обеспечения соединения с объектами, у нас поднят VPN на firewall zyxel, есть иной способ - пробросить порты, но понадобятся белые IP на всех объектах что очень накладно и настройка firewall для доступа с определенных адресов. По этому рекомендую настроить VPN в сети много мануалов.
Часть 1. Подготовка
Вывести изображение с видеорегистраторов можно несколькими способами:
через приложения для смартфонов;
На прямую видео кабелем (HDMI, VGA)
софт для ПК;
Браузер. (web-морда)
Мы будем рассматривать 4 вариант.
Вопрос остается в том как организовать автологин и прочие манипуляции в браузере, дабы не давать всем сотрудникам пароль, и не напрягать лишней работой, включил ПК и все работает.
У меня на момент выполнения задачи были базовые знания Python, С++ учил когда-то давно в универе. Выбор пал на Python так как системы с которых открывается вся история на Windows, С++ сложнее по синтаксису и давно не работал с ним, рассматривать реализацию на нем даже не стал.
В Python есть библиотека Selenium, позволяющая работать c браузерами, к сожалению Web-морды наших регистраторов корректно работают только в IE... И Selenium-у потребуется Web-driver, скачать можно с сайта библиотеки.
Ссылка на web-driver
Часть 2. Написание
Для удобства разработки использовал VS Code. (установку и настройку не буду рассматривать, информации в сети много)
Создать окружение для разработки, для этого в оболочке PS следует ввести:
python -m venv hiwatch
cd hiwatch\Scripts
.\activate.ps1
Мы создаем окружение, переходим в папку Scripts и активируем его.
Создаем файл .py и устанавливаем Selenium.
cd .. #переходим в каталог выше hiwatch\
touch video.py #создаем файл питона
pip3 install selenium #устанавливаем Selenium
так же качаем файл IE webdriver с сайта selenium (ссылка выше) и закидываем в папку hiwatch.
Ниже будет предоставлен код из файла 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
Ниже код из файла 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
Перегоняем программу из .PY в .EXE для запуска на разных хостах без установки Python и прочего, получим самостоятельную программу.
pyinstaller --noconfirm --onedir --console --add-data "C:/Users/!Ваш путь к этой папке!/IEDriverServer.exe;." "C:/Users/!Ваш путь к этой папке!/video.py"
Сборка содержится в папке dist, которая находится в одной директории с папкой hiwatch.
Ссылка на мой git с уже готовыми проектами, следует указать некоторые данные в файле .py и перегнать в .EXE
Часть 3. Заключение
Вам остается только перенести результат из папки dist на любую машину.
В заключении я хотел бы сказать что не являюсь разработчиком, и мог не совсем правильно описать некоторые действия - прошу не судить строго.
Комментарии (28)
reeshkov
12.06.2023 03:31+1Я так понимаю, селениум умеет имитацию activeX? Вроде все эти регистраторы только через него в html страничках показывают, а те, которые умеют поток отдавать можно через ffmpeg или libvlc показывать.
LeoALecksey Автор
12.06.2023 03:31Затрудняюсь ответить, плагин для работы видео докачивать придется при первом входе с устройства. А вот этот момент "ffmpeg или libvlc" нужно посмотреть, не сталкивался.
alexander222
12.06.2023 03:31+1Запросы в гугл CTV rtsp и HiWatch rtsp дают адреса потоков на первой странице поиска. Воспроизвести можно например через mplayer, что бы просто запускать с консоли.
serg-mizun
12.06.2023 03:31+3Сейчас уже практически все регистраторы, да и камеры, отдают видео по rtsp. Запускаете vlc с адресом потока и смотрите картинку. Если вы с селениумом разобрались, то тут и подавно справитесь.
13werwolf13
12.06.2023 03:31vlc mosaic весьма глючновато кстати, я как-то заморачивался. у меня было штук 5 регистраторов по 2-3 камеры, я забирал rtsp на каждую камеру и выводил мозайкой чтобы оператор мог всё видеть. проблем несколько:
1) как мозайка собрана так и останется, нельзя приблизить одну из камер например
2) жрёт cpu сильнее чем запуск такого же кол-ва отдельнозапущенных vlc
3) если одна из камер перестала показывать по любой из причин то сама она уже не подхватится, надо перезапускать (хотя если без мозайки открыть поток то емнип vlc сам переподключался)правда всё это было ну очень давно, возможно сейчас ситуация стала сильно лучше
TheHangedKing
12.06.2023 03:31Когда не было денег на коробочный ip-видеорегистратор, я использовал ZoneMinder. Он может получать потоки в разных форматах, нужно было только нагуглить правильные ссылки на поток для каждой модели камеры. Приложение для Андроида под него тоже есть, называется ZMNinja. Выглядят они довольно топорно, но работают. Многомониторные конфигурации я не пробовал. Информация устарела на несколько лет.
Как я понял из текста статьи, ваши видеорегистраторы тоже могут отдавать поток по ip, что вы и использовали.
Погуглил сейчас opensource cctv, предложений много, но как всегда, нужно проверять, как они работают.
datacompboy
12.06.2023 03:31+2Таки я скажу что автоматизация видеонаблюдения должна включать в себя автоматизацию поиска аномалий. Человек не может эффективно пялиться в экран часами -- 99% времени интересное будет пропущено. Так что поиск аномалий -- первичен. Подсветк внезапного движения по необычным углам и/или по нестандартному марштуру даст больше.
LeoALecksey Автор
12.06.2023 03:31+1У регистраторов и камер есть функции записи по движению, даже у бюджетных, в данном случае решение исходит из задачи...
LeoALecksey Автор
12.06.2023 03:31Отвечу сразу а несколько вопросов:
С rtsp не сталкивался, и честно говоря не знал что можно было так вывести поток, спасибо всем за информацию, по возможности попробую.
В ближайшем будущем планирую сделать еще дополнительные мониторинг соединения, так как есть проблема: при обрыве соединения вылетает регистратор и надо заново логиниться. Что бы в данном случае был мониторинг состояния и переподключение.
Решил пойти таким путем, потому то не пришло в голову иное, да и опыт в написании чего либо на питоне стал не лишним и интересно было самому что то придумать и реализовать. Поделился со всеми, вдруг кому пригодиться информация да и ожидал что многие подскажут другие варианты решения, обмен опытом так же полезен, список того что нужно поизучать пополнился)
Harwest
12.06.2023 03:31+1Добавлю в список полезного go2rtc - комбайн агрегатор видеопотоков транскодер
LeoALecksey Автор
12.06.2023 03:31Спасибо!)
jidckii
12.06.2023 03:31Собираете потоки на стену для webrtc с помощью go2rtc или mediamtx.
Если нужен ещё архив с них(go2rtc/mediamtx) забираете rtsp поток в yucca.app
aMster1
12.06.2023 03:31Сколько камер?
Существуют бесплатные (если как бы хочется отделаться малой кровью) варианты нормальных систем видеонаблюдения с записью, просмотрами и прочими блекджеками.
Например (ничуть не реклама) SecurOS lite. До 32 камер на одном сервере. Любые раскладки, интуитивное управление... У меня собраны куча объектов на один сервер, к нему подключен 1 арм с 2мя мониторами ( в принципе можно и на одном компе все крутить, но у меня разделено)
LeoALecksey Автор
12.06.2023 03:31согласен, получилось так, что было закуплено видеонаблюдение до меня (большая часть), стояли автономно на объектах, не было IT специалиста в организации. А уже когда пришел начал работать с тем что есть, и сеть объединять и т.д. Камер под 80 штук.
AndreyUA
12.06.2023 03:31Использую для видеонаблюдения trassir. Очень мощный софт. Есть поддержка автоматизации на python. Но, к сожалению, последние решения по ценообразованию вынуждают от него отказываться. Подскажите альтернативный софт.
TheHangedKing
12.06.2023 03:31Макроскоп был неплох. Цены не сравнивал.
AnGord
12.06.2023 03:31Макроскоп немного дешевле. Плюс есои нужна простая аналитика проще настраивается и меньше чудес с железом .
Трассир гибче. Но дороже.
Maksim4
12.06.2023 03:31Зачем такие сложности, не проще использовать единое решение. Допустим купить ПО для видеонаблюдения допустим IP линия, ITV интеллект, Trassir, dominashion или любое другое.
LeoALecksey Автор
12.06.2023 03:31Так проше, но платно)
Maksim4
12.06.2023 03:31Это единая система, для организации это плюсы. Кто будет её поддерживать когда ты уволишься. Это не дорого, дорогой тут только ITV
Dieul
12.06.2023 03:31Почему бы не использовать requests вместо костыля со sleep ?
LeoALecksey Автор
12.06.2023 03:31Вы имеете в виду отправлять get запрос и если приходит 200 то продолжать?
Выбор пал на sleep в тот момент когда скрипт кинул в автозагрузку и на старом ноуте он начинал работать (win 7), вылетала куча ошибок, потому как браузер не успевал открыться, потом долго открывал ссылки, переходил на странички.
edgi
12.06.2023 03:31Слегка не по теме. А вы vpn на объектах какой использовали? L2TP? Скорость проседает? я перешёл на wireguard.
JPEGEC
Осталось за кадром как на экран броузера размещают картинки с разных объектов.
Сам подход конечно достаточно странный, но работает же.
LeoALecksey Автор
Делал на 1 экран 1 регистратор, к машине цеплял 2 экрана и выводил на каждый по регистратору на 8 портов, но еще не разобрался как разнести на 2 экрана 2 вкладки браузера, дабы вручную этого не делать. Есть на Гите файл с открытием 2-х вкладок.
А вывести с 2-х объектов можно используя 1 регистратор и маршрутизацию, у меня такая история с Hiwatch.