Создание мозаики для мониторинга телеканалов кабельной сети

При большом количестве транслируемых телеканалов возникают трудности мониторинга качества вещания. Кто-то использует несколько телеприёмников, кто-то довольствуется одним монитором. В любом случае приходится время от времени прогонять все каналы для контроля изображения и звука. В этой статье я опишу как поднять универсальную систему мониторинга аналоговых телеканалов на базе ПК под управлением операционной системы 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.

Запись опубликована в рубрике Linux, PHP, Программирование, Телевидение с метками , , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий