Организация живой трансляции с ip камеры на сайте
Задача
Рассмотрим задачу по организации на сайте живой видео трансляции с ip камеры.
Наш стенд состоит из трёх составных частей:
- ip камера
- медиасервер
- flash плеер в браузере на стороне клиента
Выбор ip камеры
Для того чтобы было комфортно брать с камеры поток, она должна поддерживать трансляцию живого видео (обычно по протоколу RTSP). Существуют ещё вариант, когда с камеры в любой момент времени можно забрать JPEG с текущим кадром по протоколу HTTP, но это не так удобно. Поэтому была выбранна камера D'Link DCS-2121 с поддержкой RTSP.
Медиасервер
Самая сложная часть конфигурации так как на него ложатся функции по получению видео с камеры, конвертации в необходимый формат, кешированию и раздачи клиентам. Забегая вперёд, скажу, что раздавать в данном случае целесообразно либо по адобовскому протоколу RTMP, который нативно поддерживается флеш плеерами, либо по HTTP.
Для RTMP существуют платные решения: FMS, Wowza (последний бесплатный при количестве одновременных подключений менее десяти) и бесплатные (red5 и rtmpd).
Если раздавать по HTTP, то вариантов ещё больше, так как задача разбивается на две подзадачи:
- конвертация видео
- раздача видео
Естественно, что количество комбинаций растёт. Для раздачи можно использовать, например, apache или lighthttpd. Для конвертирования — ffmpeg.
В моём случае нужно было сделать всё
- под линуксом
- бесплатно
- просто
Поэтому я остановился на самом, на мой взгляд, простом варианте, при котором на сервере нам потребуется только одна программа — видеплеер VLC, которую, мы, впрочем будем конфигурировать и компилировать под наши нужды. Этот видеоплеер не имеет пока нормальной поддержки RTMP, поэтому мы будем отдавать flv файл по HTTP.
flash плеер в браузере на стороне клиента
В принципе, должен подойти любой, но у меня, почему-то так и не получилось настроить JW Player. FLV файл бесконечно скачивался клиенту, а буферизация не заканчивалась. Сроки поджимали и поменял плеер на Flow player, в результате чего эта проблема исчезла.
Настройка
Переменные
Чтобы не делать оговорок дальше, будем считать, что у меня ip адрес сервера — 10.0.0.2, камеры — 10.0.0.3, маска 255.0.0.0 и шлюз 10.0.0.1, в линуксе я работаю под пользователем user, все необходимые команды запускаю через sudo.
Настройка камеры
Настроим камеру через web интерфейс, зададим необходимые сетевые параметры: ip адрес, маска, шлюз, выставим время. Так же нам необходимо указать порт, на котором камера будет отдавать RTSP поток (стандарно используется порт 554, его я и оставил).
В разделе «Audio and Video» зададим характеристики видео, которые нам необходимы. В любом случае, мы можем поменять битрейт и размер картинки в последствии на сервере при конвертации, но чтобы всё было аккуратно, укажем сразу и здесь. Будем использовать MPEG4 640x480, 15 fps, 512kb битрейт.
Так же тут необходимо указать RTSP URL этот адрес будет использоваться при забирании потока с камеры, от нас требуется указать только имя файла. Я ввёл camera1.sdp. В итоге поток будет доступен по ссылке rtsp://10.0.0.3:554/camera1.sdp
Настройка сервера
Подойдёт любой линукс, я исопльзовал Debian Lenny. Создаём в хоуме папку, в которой будем работать:
- mkdir ~user/install
- cd ~user/install
Нам понадобится качать кодеки, поэтому подключаем репозиторий debian-multimedia:
- wget http://www.debian-multimedia.org/pool/main/d/debian-multimedia-keyring/debian-multimedia-keyring_2008.10.16_all.deb
- dpkg -i ./debian-multimedia-keyring_2008.10.16_all.deb
Добавляем в /etc/apt/sources.list строчку
- deb http://www.debian-multimedia.org stable main non-freel.deb
Нам понадобится установить множество пакетов прежде чем мы перейдём непосредственно к VLC. Я постарался перечислить здесь всё, но возможно, кое-чего не хватит, в этом случае недостающие надо будет доставить.
- apt-get update
- apt-get install yasm make subversion xcb libxcb1-dev libxcb-shm0-dev libxcb-keysyms0-dev \
- libavformatcvs51 libavcodeccvs51 libavcodeccvs51-dev libavformatcvs51-dev libavutilcvs49-dev \
- autoconf g++ gcc liba52-0.7.4-dev libdvbpsi3-dev libdvbpsi3 libfaad-dev libfaac-dev libfribidi-dev \
- libavutilcvs49 libavahi-client3 libavahi-common-dev libpostproccvs51-dev libswscalecvs0-dev \
- libswscalecvs0 libxvidcore4-dev libxvidcore4 libx264-dev libx264-54 automake1.9 libgcrypt11-dev \
- liblame-dev liblua5.1-0-dev libmad0-dev libmpeg2-4-dev libogg-dev libvorbis-dev zlib1g-dev \
- libvcdinfo-dev libiso9660-dev libcddb2-dev libflac-dev libx264-dev x264
Всё остальное будем ставить из исходников чтобы иметь возможность включать, либо отключать те или иные опции. Начнём с последней версии ffmpeg:
- svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg
- cd ffmpeg
- ./configure
- make
- make install
- cd ..
Если планируется работа с кодеком h264, то можно сконфигурировать ffmpeg с опциями
./configure --enable-libx264 --enable-gpl
Далее нам понадобится очень нужная библиотека live555 streaming media, именно с помощью неё наш VLC плеер будет работать с RTSP.
- wget http://www.live555.com/liveMedia/public/live555-latest.tar.gz
- tar zxvf ./live555-latest.tar.gz
- cd live
- ./genMakefiles linux
- make
- cd ..
Теперь переходим к самому VLC плееру. Заходим http://download.videolan.org/pub/videolan/vlc/latest/ и смотрим, какая самая свежая версия, после чего выкачиваем и распаковываем исходники. В моём случе это выглядело так:
- wget http://download.videolan.org/pub/videolan/vlc/latest/vlc-1.1.0.tar.bz2
- bzip2 -d vlc-1.1.0.tar.bz2
- tar xvf ./vlc-1.1.0.tar
- cd vlc-1.1.0
Конфигурация VLC — самая творческая часть, постараемся сделать так чтобы было то что нам надо и ничего лишнего. - ./configure --enable-release --enable-faad --disable-dbus --disable-hal \
- --disable-remoteosd --disable-qt4 --disable-skins2 --disable-activex \
- --disable-v4l2 --disable-libv4l2 --disable-x11 --disable-xvideo --disable-glx \
- --disable-opengl --disable-visual --disable-nls --disable-mozilla \
- --enable-realrtsp --enable-flac --disable-lua --prefix=/usr\
- --with-live555-tree=/home/user/install/live --with-ffmpeg-tree=/home/user/install/ffmpeg
В последней строчке мы указываем пути к исходникам ffmpeg и live555, с которыми мы работали на предыдущих шагах. Если планируется работа плеера под рутом, необходимо добавить ключ --enable-run-as-root, если кодек h264 --enable-x264
Далее компилируем и ставим плеер. Эта процедура занимает достаточно долго времени. В моём случае для компиляции постоянно чего-то не хватало, я постарался перичислить все необходимые библиотеки, но в любом случае, от версии к версии всё может меняться, так что следите за ошибками и доставляйте, что он попросит.
- make
- make install
Установка софта завершена, все что нам осталось — это запустить плеер с нужными параметрами. Вообще, VLC плеер уникален по своеё гибкости.
Плеер будет у нас работать в два одновременных потока: первый будет получать видео с камеры по RTSP мультиплексировать его в MPEG TS и отдавать на localhost:8001, второй будет забирать результат с localhost:8001, пережимать, кодировать, упаковывать в FLV контейнер и отдавать по HTTP на порту 8080.Сделаем 2 файла для запуска этих потоков соответственно:
В stream1.sh вставляем строчки:
- #!/bin/sh
- vlc -vv rtsp://10.0.0.3:554/camera1.sdp --rtsp-caching=100000 --no-sout-audio --sout \
- '#std{access=http,dst=127.0.0.1:8001,mux=ts}'
Здесь мы указали плееру, что и куда проигрывать. В качестве источника выбран поток с камеры rtsp://10.0.03:554/camera1.sdp, указали размер буфера и сразу не первой стадии сделали наше кино немым (--no-sout-audio). Результат будет отдаваться этим потоком по адресу http://127.0.0.1:8001В stream2.sh вставляем строчки:
- #!/bin/sh
- vlc -vv http://127.0.0.1:8001 --loop --http-caching=10000 --sout \
- '#transcode{vcodec=FLV1,vb=512,fps=15}:std{access=http{mime=video/x-flv},dst=:8080/view01.flv,mux=ffmpeg{mux=flv}}'
Второй поток забирает http://127.0.0.1:8001, имеет свой собственный кэш, пережимает его (vb — битрейт, fps — фпс) и раздаёт его по HTTP на порту 8080 как файл view01.flv. Если на сервере несколько интерфейсов, то можно указать в dst так же конкретный ip адрес того интерфейса, на котором необходимо раздавать.
В промышленной эксплуатации потоки надо запускать фоном и без привязки к консоли, в нашем же примере, мы запустим их просто в двух консолях. vlc должен некоторое время наполнять буфер, а потом перейти в штатный режим. Длительность наполнения напрямую зависит от размера кэша (--rtsp-caching и --http-caching соответственно).Нам понадобится создать страничку с плеером. Для простоты сделаем её на этом же сервере.
- apt-get install apache2
Настройка плеера
- cd /var/www/
Далее скачиваем Flow Player. На сайте разработчика есть мастер настроек, чтобы воспользоваться им, необходимо зарегистрироваться. Доступен мастер по адресу http://flowplayer.org/setup/index.html.
Так как у нас живой стрим и камера выводит текущее время прямо в картинку, от плеер должен быть минималистичным. Отключаем всё кроме кнопки «Fullscreen», скачиваем плеер и распаковываем содержимое архива в папку /var/www на нашем сервере.
Чтобы всё было идеально, я ещё и переименовал файлы swf и js в player.swf и player.js соответственно. Я бы не писал об этом факте, если бы на забыл как они назывались до этого. Поэтому в тексте я так же буду использовать свои новые имена. Итак, создаём html страничку
- touch /var/www/index.html
Сохраняем в неё следующий текст:- <html><head>
- <meta http-equiv="content-type" content="text/html; charset=UTF-8"><script type="text/javascript" src="/player.js"></script>
- <title>Просмотр камеры 1</title>
- </head>
- <body>
- <h1>Камера № 1</h1>
- <a
- href="http://stream.kubsu.ru:8080/view01.flv"
- style="display:block;width:520px;height:330px;margin:10px auto;"
- id="player">
- </a>
- <script>
- flowplayer("player", "/player.swf");
- </script>
- </body></html>
Всё готово, заходим в браузере на http://10.0.0.2/ и смотрим трансляцию.
Created/Updated: 25.05.2018