Архивы: vlc

VLC Mass IP cams transcoding

В общем есть такой тип проектов, в которых используют большое количество ip камер. Как правило это проекты связанные с городской безопасностью. Например http://www.podryad.tv/live_cam/ один из таких проектов..

В данной статье я расскажу как просто и эффективно реализовать подобный сервис. Соответственно будем считать, что камеры по городу или объекту расставлены, работают и доступны по сети. В данном конкретном случае будут использоваться камеры AXIS различных моделей. Благо интерфейс доступа к потоку у них стандартизирован.

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

Кратко опишу техническую задачу.

Есть некоторое количество камер потоки с которых нужно транслировать на сайт предварительно перекодировав поток с заворачиванием в FLV контейнер. Как дальше оно будет разруливаться не особо важно.

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

Небольшая ремарка по поводу производительности..

Рабочий проект содержащий > 60 камер, обслуживался одним сервером Dell R710 с двумя процессорами Intel Xeon SixCore X5650 @ 2.67GHz c 6Gb RAM при этом потоки принимались на один гигабитный сетевой интерфейс и через такой же отдавались.. Интенсивность потока в среднем 400Mb/s при разрешении картинки в 840х480.. Средняя загрузка системы за 5ть минут составляла примерно 30 единиц.

Работать все будет под управлением OS GNU/Debian 6.0. В принципе под другими дистрибутивами наверно будет работать не хуже.

И так начнем. Для начала нужно поставить необходимые пакеты, в частности сам vlc (а точнее vlc-noc) со всеми зависимостями. так же советую подключить репозитории проекта debian-multimedia если вам понадобится кодировать потоки например в h264.

Когда установка будет закончена, надо создать не привилегированного пользователя от имени которого и будет работать vlc.

Теперь собственно о том как настроить и как всем этим управлять..

В VLC есть такая приятная фишка как  VLM, по сути простой стрим лист. возможности которого по настоящему безграничны.

Вот пример такого листа:

new cam26 broadcast enabled
setup cam26 input http://user:*****@XXX.XXX.XXX.XXX/axis-cgi/mjpg/video.cgi
setup cam26 output #transcode{vcodec=FLV1,vb=5000,fps=25,ab=192,samplerate=48000}:std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8080/stream26.flv}
control cam26 play

new cam25 broadcast enabled
setup cam25 input http://user:*****@XXX.XXX.XXX.XXX/axis-cgi/mjpg/video.cgi
setup cam25 output #transcode{vcodec=FLV1,vb=5000,fps=25,ab=192,samplerate=48000}:std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8080/stream25.flv}
control cam25 play

По сути нету ничего сложного, важно, что лист может содержать огромное количество подобных записей.

Немного об опциях транскодинга и вывода.

#transcode{vcodec=FLV1,vb=5000,fps=25,ab=192,samplerate=48000}

  • vcodec — собственно видео кодек в нашем случае это флеш кодек.
  • vb — видео буфер — значение подбирается экспериментально, если изображение мигает или сыпется, данный параметр нужно увеличить. Помните, что увеличивая его вы увеличиваете количество пожираемой ОЗУ.
  • fps — количество кадров в секунду, советую устанавливать значение равное значению выставленному на камере.. Если сервер транскодинга слабоват, значение можно уменьшить, но и качество соответственно будет хуже.
  • ab — аудио буфер — если планируется трансляция звука.
  • samplerate — входная частота дискретизации.

{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8080/stream25.flv}

  • access — указывает на тип доступа к потоку, в нашем случае http
  • mime — mime тип для транспорта
  • mux — мультиплексор, в нашем случае ffmpeg, который будет заворачивать поток в контейнер flv
  • dst — собственно url по которому наш поток будет доступен для клиентов.

Теперь немного об аргументах с которыми стартует сервер. Вся строка выглядит так :

cvlc -d -q —pidfile=/var/run/vlc.pid —ttl 8 -I telnet —telnet-host=0.0.0.0 —telnet-password=********* —sout-transcode-high-priority —http-reconnect —http-caching=10000 —logmode=syslog —rt-priority —vlm-conf /home/vlc/vlc-stream-list.cfg

Разберем ее по порядку:

  • -d — опция которая говорит vlc запускаться как демон
  • -q — опция подавляющая вывод в stdout/stderr сообщений.
  • —pidfile — опция указывающая где будет создан файл идентификатора процесса, так как наш сервер будет запущен с опцией -d то это будет актуально, особенно если вы захотите в дальнейшем написать скрипт для /etc/init.d
  • —ttl — параметр не особо важный, но все же. Его назначение это указание маршрутизаторам время жизни транспортного пакета.. по истечению которого оный будет уничтожен.. Если трансляция осуществляется в рамках одного сегмента, можно установить параметр в единицу, меньше мусора будет.
  • -I тип интерфейса управления, в нашем случае telnet, есть еще http и что-то еще я уже не помню..
  • —telnet-host — с какого адреса ждать подключения к telnet консоли.
  • —telnet-password — тут все понятно..
  • —sout-transcode-high-priority — опция говорит что процессы транскодинга должны выполнятся с наивысшем приоритетом (аналог системной утилиты nice).
  • —http-reconnect — опция заставляющая vlc пытаться восстановить соединение с http транспортом камер. (При условии что таковой используется, если забор потока идет через rtp сия опция бесполезна)
  • —http-caching — кеш http трафика полезная опция при высокой нагрузке на сеть
  • —logmode логи работы vlc будут обрабатываться системными средствами, в частности syslog
  • —rt-priority очень важная опция заставляющая работать процессы vlc  с приоритетом реального времени. ВНИМАНИЕ! Если на сервере транскодинга запущены другие программы фонового характера работы.. Данная опция может серьезно снизить их производительность.
  • —vlm-conf путь до стрим листа.

Вот собственно и все..

Дальше все, что вам нужно сделать это забить стрим лист данными о потоках и запустить сервер.

Вот так после запуска это выглядит у меня :

Работа vlc транскодера на 60 потоках.

Теперь надо подумать о том как этим управлять..

Для управления я сделал следующее:

  1. Создал таблицу в бд где храню информацию о потоках, их номера параметры кодирования и вывода, IP адреса логины и пароли для доступа к камерам и многое другое, что сильно упрощает жизнь.
  2. На сервер я поместил скрипт который по крону или в ручную регенерирует стрим лист и перезагружает сервер.
  3. Написал небольшую программку для управления записями в БД.

Собственно все.. Кому будет интересно могу предоставить структуру таблицы и сходный код программки..

За сим откланюсь, надеюсь изложенная информация будет вам интересна и полезна.

Успехов.