VLC Streaming или решаем проблему узкого канала к IP камере

На днях столкнулся с нетривиальной проблемой. Организовано вещание с ip камеры на объекте в интернет по следующей схеме:

камера на объекте не правильный вариант

Но при подключении более 3-х пользователей Йота канал прогибается и изображение «зависает».

Наиболее правильное решение этого вопроса это организовать мультимедийный сервер на стороне провайдера, я арендовал недорогой VPS на firstvds.ru за 149 рублей с безлимитным трафиком. На стороне провайдера канал пошире, забирать изображение одним клиентом и передавать серверу для дальнейшей раздаче пользователям, а так же в процессе мы еще можем перекодировать в нужный нам формат, а так же организовать при необходимости запись потока. Но мы остановимся на получении перекодировании в FLV формат и отдаче потока по определенному порту для flash плеера.

камера на объекте правильный вариант

Для этой цели нам пригодится машина с CentOS (я арендовалнедорогой виртуальный сервер, что бы не возиться с виртуальными машинами установкой ОС, а так же что бы не забивать канал до офиса видео-трафиком)

Итак начнем.

для начала обновим окружение

yum  update


Далее устанавливаем ffmpeg и vlc

yum list | grep vlc


выводит список доступных пакетов vlc

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

выбираем и устанавливаем

yum install vlc
yum install vlc-devel


далее проверим как у нас vlc взлетело, консольная версия (без GUI) вызывается командой cvlc

cvlc --help


Получаем подробнейшую справку по vlc :)

Устанавливаем ffmpeg

yum list | grep ffmpeg


Получаем список доступных пакетов

yum install ffmpeg
yum install ffmpeg-devel
yum install ffmpeg-libpostproc


Далее получим и проверим с камеры поток по протоколу rstp. Мы используем камеру производителя SpyG (почти все камеры умеют раздавать видео в протоколе rtsp).

Открываем веб интерфейс камеры и делаем кое-какие настройки.

Настройки rtsp камеры Spy-G

выключили второй поток, настроили разрешение, выбрали 5 fps больше не требуется, внимательно посмотрели как выглядит адрес rtsp. В данном случае адрес будет выглядеть следующим образом:
rtsp://IP_Adress/mp4


где IP_Adress == внешний айпи адрес камеры в примере будем использовать 1.2.3.4

Открываем на любой машине vlc плеер -> открыть URL и вставляем туда наш адрес rtsp://1.2.3.4/mp4

Должна появиться картинка с камеры, если не появилась обратите внимание firewall и NAT роутера в которого включена камера.

Внимание протокол работает на стандартном порту 554, его необходимо прокинуть наружу. так же протокол rtsp поддерживает авторизацию, настройки используйте исходя из документации, но по стандарту как только на руках будет у вас логин и пароль (при необходимости использования авторизации) адрес будет выглядеть следующим образом с учетом данных авторизации.

rtsp://login@password:1.2.3.4/mp4


Касаемо выбора видео формата передаваемого изображения я выбрал формат JPEG т.к. видео в данном формате может быть использовано в юридических целях, т.к. это именно момент события, в отличие от протокола h.264 который в картинке меняет разницу (только изменившиеся части в кадре)

В итоге в плеере мы должны увидеть картинку ну например такую

vlc rtsp поток с камеры в плеере

Все поток мы имеем, теперь надо организовать получение его vlc и перекодирование в vlc

сразу делаем рабочую папку, куда будем складывать скрипты

mkdir /root/vlc


и делаем там наш первый скрипт который будем запускать наш транскодер

cd /root/vlc/
touch transcodevlc.sh


и сделаем его исполняемым

chmod +x transcodevlc.sh


Давайте же напишем первые строчки нашего скрипта запуска

vi /root/vlc/transcodevlc.sh

(жмем I для режима редактировании INSERT)
и вставляем следующее

cvlc rtsp://1.2.3.4:554/mp4 --no-sout-audio --sout '#transcode{vcodec=FLV1,vb=800,fps=5,sfilter=logo}:std{access=http{mime=video/x-flv},dst=:8080/view01.flv,mux=ffmpeg{mux=flv}}'

(жмем ESC выходим из режима редактирования, жмем: для перехода в командный режим, далее жмем wq и ENTER что означает (w)rite (q)uit, сохраниться и выйти.

Наш первый скрипт получает по rtsp протоколу поток, и перекодирует его в flv с битрейтом 800, fps = 5 и отдает его всем адресам на порт 8080( если до двоеточия указать адрес будет выдавать только на этот адрес. Это можно использовать да большей секьюрности если необходимо)

Не буду углубляться в установку веб сервера apache это будет Вам домашним заданием, лишь напомню что в CentOS используется механизм yum.

Теперь в www директории сервера (у меня она находится /var/www) создадим html страничку с следующим содержимым для просмотра flv потока браузерным флеш плеером vs, флешовый плеер мы будем использовать под названием flowplayer погуглите и киньте файлы указанные в скрипте ниже в директорию /var/www:

vi /var/www/index.html


<html><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<!-- A minimal Flowplayer setup to get you started -->
  

	<!-- 
		include flowplayer JavaScript file that does  
		Flash embedding and provides the Flowplayer API.
	-->
	<script type="text/javascript" src="flowplayer-3.2.8.min.js"></script>
	
	<!-- some minimal styling, can be removed -->
	<link rel="stylesheet" type="text/css" href="style.css">
	
	<!-- page title -->
	<title>ltc webcam</title>

</head><body>

	<div align="center" id="page">
		
		<!-- this A tag is where your Flowplayer will be placed. it can be anywhere -->
		<a 
			 href="http://1.2.3.4:8080/view01.flv"
			 style="display:block;width:800px;height:600px"  
			 id="player"> 
		</a> 
	
		<!-- this will install flowplayer inside previous A- tag. -->
		<script>
			flowplayer("player", "flowplayer-3.2.9.swf");
		</script>

	</div>
	
	
</body></html>


После теперь у нас есть работающая система перекодирования

Запускаем и наслаждаемся картинкой.

web-chrome-vlc-transcoder

Чуть ниже мы добавим необходимые прибамбасы для нашего мультимедиа сервера (добавим LOGO, настроим вывод LOG файлов в VLC а так же отрегулируем logrotating, настроим кеширование потока, и добавим немного полезных ключей)

UPD. В результате изменили настройки FPS на камере и в конфиге до 3fps, а так же добавили полезных ключей для кеширования и автоматического переподчинения vlc по rtsp после разрыва связи.

cvlc -vvv rtsp://1.2.3.4:554/mp4  --no-sout-audio --loop --sout '#transcode{vcodec=FLV1,vb=1024,fps=3,sfilter=logo}:std{access=http{mime=video/x-flv},dst=:13280/view01.flv,mux=ffmpeg{mux=flv}}' --extraintf logger --logfile /var/log/vlc.log --logo-file /root/vlc/logo.png --logo-position=6 --logo-opacity=100

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.