При большом количестве транслируемых телеканалов возникают трудности мониторинга качества вещания. Кто-то использует несколько телеприёмников, кто-то довольствуется одним монитором. В любом случае приходится время от времени прогонять все каналы для контроля изображения и звука. В этой статье я опишу как поднять универсальную систему мониторинга аналоговых телеканалов на базе ПК под управлением операционной системы Linux/Debian.
Из оборудования я применил обычный персональный компьютер в следующей конфигурации: мамка AsRock, проц Sempron 2800+, память 1 гб, винт 250 гб, блок питания 500 w. В PCI-слот компьютера ставим плату ТВ-тюнера Beholder H7. При установке Debian инсталлируем веб-сервер + интерпретатор PHP.
Необходимые пакеты для «голой» Linux:
apt-get install mc openssl gettext libssl-dev screen monit dvb-apps htop iftop ifstat vlan build-essential mercurial libncurses-dev libevent-dev libglib2.0-dev unzip linux-headers-`uname -r` gpm command-not-found
Ставим драйвера для платы тв-тюнера:
git clone git://linuxtv.org/media_build.git cd media_build ./build make install
В /etc/modprobe.d создаём файл sa7134.conf с содержимым:
options saa7134 secam=d alsa=1 options xc5000 no_poweroff=1
Перезагружаем комп и наблюдаем новое устройство: /dev/dvb/adapter0
Устанавливаем софт с которым будем работать:
apt-get install vlc tvtime v4l-utils
VLC под рутом не запускается. Исправляем это: http://conture.by/post/906
Ещё необходим FFMPEG. Если установить пакет через aptitude, то будет такая вот нелицеприятная картина:
Его (ffmpeg) надо ставить через гит, как описано здесь: http://ffmpeg.org/download.html. Я собираю с такими опциями:
./configure --enable-shared --enable-gpl --enable-nonfree --enable-libfreetype
При этом заранее должно стоять всё сопутствующее: yasm, libpng, freetype. Последний библик необходим для формирования бегущих строк и графической информации для цифрового телеканала, но об этом я расскажу в ближайшем будущем. После того как FFMPEG собран при попытке его запуска будет выскакивать ошибка:
error while loading shared libraries: libavdevice.so.52: cannot open shared object file: No such file or directory
Добавим в /etc/ld.so.conf.d файл libavdev.conf с содержимым:
/usr/local/lib
Выполним ldconfig — FFMPEG готов к работе.
Смысл работы всего этого велосипеда мозаики заключается в следующем. Карта перестраивается по заданным частотам в bash-скрипте. На одном канале висим около 3 секунд. Тут-же с неё пишем видео в файл при помощи VLC. По окончании процесса записи файла FFMPEG-ом выдираем скриншотики по заданному временному значению. Опытным путём было установлено, что на переключение с одной частоты на другую тв-тюнеру необходимо 0.5 сек. Таким образом скриншот первого канала находится — 00:00:01.0, второго — 00:00:04.5 и т.д.. Они помещаются в папку веб-сервера, зайдя на который можно визуально промониторить все телеканалы. По идее можно перестраивать тюнер и тут же делать снимок экрана, но VLC этого не умеет, а как такое осуществить с помощью FFMPEG я не нашёл.
В файле кронтаба /etc/crontab дописываем задание на запуск скрипта ./fromtv.sh каждые 3 минуты:
SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # m h dom mon dow user<>command 17 * * * * root cd / && run-parts --report /etc/cron.hourly 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) */3 * * * * root ./fromtv.sh
Файл скрипта /root/fromtv.sh для записи видео и перестройки тюнера:
#!/bin/bash v4l2-ctl --set-freq=59.25 sleep 1 screen -d -m -S fromtv1 cvlc v4l2:// --sout "#transcode{vcodec=mp2v,vb=3000,audio=mp2a,ab=512}:standard{access=file,dst=fromtv.mpg}" # перебираем частоты for A in 77 85 93 111 119 127 135 143 167 175 183 191 207 223 231 239 247 255 263 271 279 287 295 471 478 495 503 511 519 535 543 567 575 583 599 607 615 623 631 647 655 663 671 679 687 do sleep 3 v4l2-ctl --set-freq=$A.25 done sleep 4 killall vlc ./mosaic.sh exit 0
Файл /root/mosaic.sh для создания скриншотов из видео:
#!/bin/bash i=1 tdir=$(/bin/date +%s) mkdir /var/www/mosaic/$tdir chmod 777 /var/www/mosaic/$tdir for A in 0:01.5 0:05.0 0:08.5 0:11.5 0:15.0 0:18.5 0:22.0 0:25.5 0:29.0 0:32.5 0:36.0 0:39.5 0:43.0 0:46.5 0:50.0 0:53.5 0:57.0 1:00.5 1:04.0 1:07.5 1:11.0 1:14.5 1:18.0 1:21.5 1:25.0 1:28.0 1:32.0 1:33.5 1:38.0 1:42.5 1:46.0 1:49.5 1:53.0 1:56.5 2:00.0 2:03.5 2:06.5 2:10.0 2:13.5 2:17.0 2:20.5 2:24.0 2:27.5 2:31.0 2:34.5 2:36.7 do ffmpeg -ss 0:0$A -i fromtv.mpg -f mjpeg -vframes 1 -s 400x320 /var/www/mosaic/$tdir/$i.jpg i=$[$i+1] done
На оба башевских скрипта не забываем выставить chmod 777.
На сервер /var/www/ распаковываем вот эти файлики.
Обновление картинок в браузере каждые 3 минуты. Происходит оно как только появится свежая папка со скринами (выполняются ajax-запросы). В целом, смотрится это вот так:
Сегодня ночью шёл сильный дождь, а в таких случаях, как правило, глючит весь 75-ый градус. Можем это посмотреть, промониторив архив ночных скриншотов
UDP. Текущая версия мозаики:
UPD. Аналогия для мозаики udp-шных каналов.
Используем ffmeg отсюда: http://ffmpeg.gusari.org/static/
Файл парсера скриншотов parse.sh:
#!/bin/bash localaddr=192.168.55.70 service=ffmpeg0 ABSOLUTE_FILENAME=`readlink -e "$0"` DIRECTORY=`dirname "$ABSOLUTE_FILENAME"` cd $DIRECTORY SWAP=/var/www/sources/mosaic/udp while [ 1 ] do FILE=$DIRECTORY/ipchannels # файл с каналами в каждой строчке "123;Моя планета;239.233.2.10;\n" j=1 n=15 # по 15 каналов за раз ti=$(/bin/date +%s) exec 10 /dev/null then killall $service fi fi if ! [ -d $SWAP/$chid ] then mkdir $SWAP/$chid chmod 777 $SWAP/$chid fi ./$service -loglevel panic -timelimit 13 -i udp://$chmrl:1234?localaddr=$localaddr -f mjpeg -vframes 1 -s 108x86 $SWAP/$chid/$ti.jpg & let "j++" done rm $SWAP/update echo "$ti" >>$SWAP/update done exit 0;
Для 120 каналов период обновления составляет 2 минуты. Скрипт parse.sh запускаем в screen.