[Из песочницы] Создаем видеостену с трансляцией изображения с ip-камер через спутник с минимумом трафика

В статье рассказывается о том, как обеспечить «почти видеотрансляцию» средствами ffmpeg, wget, JS, html и такой-то матери. По сути, мы создаем слайдшоу с аккуратным его выводом и динамическим обновлением на веб-страничке. Возможно, кому-то пригодится мой опыт.Знающие люди не найдут в статье ничего нового для себя, но, если прочтут, я бы с удовольствием выслушал замечания по улучшению этой схемы.Вступление и предысторияЯ работаю системным администратором (специалистом по сетевому обеспечению) в компании, у которой, по роду деятельности, есть около 10 филиалов, расположенных в тайге. Интернет во всех филиалах, кроме одного, самого счастливого, предоставляется через спутник. Спутниковый интернет, когда это единственный способ связи с внешним миром (кроме шуток, ближайший поселок со связью обычно километрах в 70), оказывается очень нестабильной и недешевой штукой.Помимо прочего (почта, sip-телефония), интернет в нашей компании тратится на видеонаблюдение. Директорат очень желает наблюдать за работами в филиалах. Но трафика мало. На максимальном тарифе FAP.4000+.AST 2Гб трафика в сутки, что при наличии трех двухмегапиксельных камер просто смешно. В принципе, изображение с камер можно порезать (мы так и делаем), но все равно просмотром камер без внутренних ограничений по трафику точку легко загнать в «жесткое ограничение» (при достижении лимита суточного трафика). Одна камера при потоке 128 кбит\с за сутки съест 1350 мб.

Мне была поставлена задача создать для директоров своего рода «видеостену», куда бы выводились изображения со всех камер нашей фирмы. При драконовских ограничениях спутникового интернета речи про прямое получение потока с камеры не идет. Софт типа ПО от Macroscop не поддерживает перекодировку потока с камеры «на лету». Если честно, мне кажется, что Macroscop отдает своему клиенту более жирный поток, чем получает от камеры. Я экспериментировал с VLC (нестабильно, периодически плагин для браузера крашится или самопроизвольно ставит на паузу поток, жрет много ресурсов при транскодинге), ffmpeg+ffserver (так я и не завел эту связку). В итоге я пришел к идее захвата скриншотов с потока от камер и его дальнейшей передачи в центральный офис с заданной периодичностью. Все получилось, но получилось топорно и кондово. Я бы сказал дубово. Но работает. Допиливать буду в будущем.

Техническая часть Камеры у нас, в основном, Beward. Есть несколько Hikvision. Все камеры (в теории, но о практике позже) поддерживают RTSP. В идеальных условиях его мы и используем. Конечную картинку всегда выдаем через ffmpeg — он подгоняет размер изображения и качество jpg, оперируя этими параметрами, мы можем управлять количеством трафика, которое утекает за сутки. Также, на количество трафика влияет частота запроса кадров с центрального сервера.Дальше за дело берется JavaScript и немного HTML (и капельку php). На просторах интернетов был найдет скрипт на JS, который динамически обновляет картинку на странице, но только предварительно загрузив её и выловив событие OnLoad. Под это дело была подготовлена страница, которой я передаю параметры (Имя камеры, адрес её админки, ссылка на скриншот).

Персональная страничка камеры

{$_GET['textpage']}»;?>
id=«camimage» src=» alt=»>
» ?> [Админка]»;?> [Картинка отдельно]»;?>
Как это все увязано В филиалах на серверах (win 2008 r2 или win 7, если это отдельная виртуалка) установлено следующее ПО: nnCron Lite (виндовый планировщик мне настроить не удалось, он периодически зависал, спасало только ручное завершение всех экземпляров задания, отключение задания, включение и запуск); Apache 2.4; ffmpeg; wget (да, под винду, вот такой я извращенец). nnCron запускает задания (он гораздо стабильнее планировщика задач Windows), это обычные .bat, в которых ffmpeg указано что и откуда брать и как и куда складывать. Если у камеры есть трудности с RTSP, начинаются танцы с ftp, выборкой последнего скриншота и гроханьем лишних и подстановкой правильной даты в адрес, потому что бевардовские камеры хотят класть скрины именно по адресу ддммгггг\имя_камеры\1\*.jpg. Безобразие, конечно, но куда деваться?

Виндовый .bat для обработки скриншотов с камер, самостоятельно складывающих их на ftp-сервер set day=%DATE:~0,2% set month=%DATE:~3,2% set year=%DATE:~6,4% set YYYYMMDD=%year%-%month%-%day% FOR /L %%i IN (0,1,4) DO ( cd «C:\ftp\kpp\%YYYYMMDD%\kpp\1\» c: for /f %%i in ('dir /b /T: A /A:-D /O:-D *.jpg') do (copy /Y »%%i» «c:\ftp\copy\andat-kpp.jpg») C:\ffmpeg\bin\ffmpeg.exe -i «c:\ftp\copy\andat-kpp.jpg» -f image2 -vframes 1 -y -q: v 15 -s 480×360 C:\Apache24\htdocs\andat-kpp.jpg del /Q «C:\ftp\kpp\%YYYYMMDD%\kpp\1\*.jpg» timeout /t 5 /nobreak ) exit

ffmpeg складывает изображения с нужными размерами и качеством в корневую папку web-сервера. Дальше начинается работа сервера в центральном офисе, где все это складируется и подсовывается главной странице, где и размещена видеостена.Скрипт, вытягивающий скриншоты с филиала и складывающий старые скриншоты в архив #!/bin/sh cd /var/www/ mkdir /var/www/archieve/ mkdir /var/www/archieve/tuhterek mkdir /var/www/archieve/tuhterek/gep1/ mkdir /var/www/archieve/tuhterek/polygon/

cp /var/www/tuht-gep1.jpg /var/www/archieve/tuhterek/gep1/gep1-`date ±%d-%m-%Y-%H%M%S`.jpg cp /var/www/tuht-polygon.jpg /var/www/archieve/tuhterek/polygon/polygon-`date ±%d-%m-%Y-%H%M%S`.jpg wget http://172.30.99.80/tuht-gep1.jpg -O tuht-gep1.jpg.bak

cp tuht-gep1.jpg.bak tuht-gep1.jpg wget http://172.30.99.80/tuht-polygon.jpg -O tuht-polygon.jpg.bak cp tuht-polygon.jpg.bak tuht-polygon.jpg Кусочек видеостены Сервер периодически (несколько раз в минуту) выкачивает все скриншоты с точек, складывает вместо старых, старые уходят в архив. Ночью из архива их забирает другой скрипт, который бережно собирает все скриншоты в один ролик и именует его по дате и имени камеры.Скрипт, компилирующий архив скриншотов в видеоролик #!/bin/bash

tochka=$1 kamera=$2

yestday=`date +%d -d yesterday` year=`date +%Y -d yesterday` mes=`date +%m -d yesterday` stime=`date +%H%M%S -d yesterday`

mkdir /var/www/archieve/video/ mkdir /var/www/archieve/video/$tochka mkdir /var/www/archieve/video/$tochka/$kamera mkdir /tmp/picture/ rm /tmp/picture/*

echo »$day $mes $year»

cd /var/www/archieve/$tochka/$kamera/

find * -type f -size 0k -exec rm {} \; | awk '{ print $8 }'

X=1; for i in *.jpg; do mv $i /tmp/picture/$(printf %07d.%s ${X%.*} ${i##*.}) let X=»$X+1» done

cd /tmp/picture/

ffmpeg -f image2 -r 1 -i %07d.jpg -y /var/www/archieve/video/$tochka/$kamera/$kamera-$yestday-$mes-$year.avi

Блок-схема получения скриншотов 2bab5d1654c445229ee05390a1c03b15.png Дальнейшие планы Очень хотелось бы избавиться от необходимости n раз прописывать одни и те же параметры в разных скриптах. Я планирую сохранять настройки , брать их оттуда по необходимости и автоматически генерировать нужные скрипты при добавлении нужной камеры.Планирую прикрутить форму добавления новой камеры.Хотелось бы все перенести на linux (не везде есть возможность сейчас развернуть виртуалки с ним, на фирме используются преимущественно Win-сервера и hyper-v).

Хотелось бы большей надежности, увеличения качества изображений и их частоты обновления, но без сильного роста трафика.

Это не самая первая версия, но ей еще далеко до совершенства. Это, можно сказать, прототип. Посему критика (конструктивная) приветствуется, а выкрики «велосипедист на костылях» — нет. Сам знаю. Но, так как готовое ПО не выполняет наши желания, приходится изворачиваться и делать самому.

P.S. Об ошибках в личку, пожалуйста, или на почту.UPD: Часть системы самодельного мониторинга Кликабельно3325925640a747eb8c29ed5d958f145a.png Надпись «сайт доступен» выдается с помощью скрипта на php, проверяющего доступность админки камеры по http. При наведении на картинку в левом столбце всплывает полноразмерное окно.Саму стену вставлю чуть позже.

© Habrahabr.ru