В общем есть такой тип проектов, в которых используют большое количество 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, по сути простой стрим лист. возможности которого по настоящему безграничны.
Вот пример такого листа:
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 путь до стрим листа.
Вот собственно и все..
Дальше все, что вам нужно сделать это забить стрим лист данными о потоках и запустить сервер.
Вот так после запуска это выглядит у меня :
Теперь надо подумать о том как этим управлять..
Для управления я сделал следующее:
- Создал таблицу в бд где храню информацию о потоках, их номера параметры кодирования и вывода, IP адреса логины и пароли для доступа к камерам и многое другое, что сильно упрощает жизнь.
- На сервер я поместил скрипт который по крону или в ручную регенерирует стрим лист и перезагружает сервер.
- Написал небольшую программку для управления записями в БД.
Собственно все.. Кому будет интересно могу предоставить структуру таблицы и сходный код программки..
За сим откланюсь, надеюсь изложенная информация будет вам интересна и полезна.
Успехов.



Свежие комментарии