Недавно столкнулся с проблемой получения и передачи потокового видео с IP-камеры D-Link 6620G. Обнаружилось, что эта камера (как и все камеры D-Link, как мне ответил сотрудник на официальном форуме) не отдает видеопоток напрямую ни по UDP, ни по HTTP в чистом виде, что меня очень неприятно удивило. С камерой можно работать только через ActiveX-компонент, т.е. только в IE. Единственное, что можно получить — это текущий кадр через cgi-bin/video.jpg. Но задача как раз была организовать раздачу через Web. Что ж, после некоторых размышлений мне удалось это сделать, организовав следующую схему:
Работать это должно было следующим способом:
- С камеры формируется MJPEG-поток, забирая текущий кадр /cgi-bin/video.jpg. Для этого используется детектор Motion. Этот программное решение подкупило меня своей легковесностью, быстротой, а также довольно гибкой функциональностью.
- Далее ffmpeg конвертирует MJPEG-поток в flv и отдает flv-поток с помощью ffserver.
- В нужную HTML-страничку встраивается FLV-плеер, который и показывает картинку.
Опишу подробнее процесс установки и конфигурирования этого добра на Debian 4.0:
1. Подготовка:
Добавляем в /etc/apt/sources.list репозиторий debian-multimedia
deb-src http://www.debian-multimedia.org etch main
Устанавливаем пакеты
apt-get install motion ffmpeg
2. Конфигурация motion (/etc/motion/motion.conf):
Сам Motion, вообще говоря, это программный детектор движения. У него довольно много интересных настроек и опций. Конфигурирование происходит через файл /etc/motion/motion.conf.
daemon on
quiet on
# Указываем URL кадра камеры
# и, если необходимо, логин и пароль
netcam_url http://IP-АДРЕС/cgi-bin/video.jpg
netcam_userpass admin:adminpass
# Надпись слева
text_left Test
# Размер получаемого кадра c камеры
width 704
height 576
# Частота кадров. Иными словами, максимально количество кадров забираемое
# с камеры в секунду
framerate 5
# Качество забираемой картинки
quality 100
# Отключаем автояркость
auto_brightness off
#Различные настройки видео
threshold 4500
noise_level 64
brightness 0
contrast 0
saturation 0
hue 0
# Отключаем использование ffmpeg в реальном времени
ffmpeg_cap_new off
# Директория, где храним снимки и фильмы
target_dir /var/lib/motion/snapshots
# Включаем сервер, транслирующий MJPEG-поток на порту 8081
webcam_port 8081
# Разрешение соединения с MJPEG-потоком
# Если ffmpeg на другом IP, то ставим off. Иначе - on
webcam_localhost off
# Качество выдаваемого MJPEG-потока
webcam_quality 100
# Частота кадров выдаваемого потока
webcam_maxrate 5
# Отключаем запись снимков и видео.
# Можно и включить, кому хочется
output_all off
output_motion off
output_normal off
Проверить наличие MJPEG-потока можно, например, при помощи VLC media player.
3. Конфигурирование ffserver:
Настройка ffserver происходит через файл /etc/ffserver.conf:
Port 8080
# Интерфейс привязки ffserver'а (в данном случае - все)
BindAddress 0.0.0.0
# Максимально дозволенное количество клиентов
MaxClients 1000
# Пропускная способность в kbit/sec
MaxBandwidth 100000
# Файл журнала
CustomLog /var/log/ffservser.log
...
# Описываем feed
<Feed feed1.ffm>
File /tmp/feed1.ffm
FileMaxSize 10M
</Feed>
...
# Поток Flash Video
# Описываем его параметры (bitrate, framerate, buffersize и т.д.)
<Stream test.flv>
Feed feed1.ffm
Format flv
VideoCodec flv
#VideoFrameRate 4
VideoSize 4cif
VideoBitRate 2000
#Qscale 2
#VideoBufferSize 256
#VideoQMin 10
#VideoQMax 10
#VideoIntraOnly
PreRoll 0
NoAudio
</Stream>
...
# Можно включить статистику
<Stream stat.html>
Format status
# Only allow local people to get the status
#ACL allow localhost
ACL allow <IP-адрес>
</Stream>
...
4. Скрипты запуска и остановки ffmpeg и ffserver:
Для запуска и остановки ffmpeg и ffserver создаем простые shell-скрипты.
start_ffmpeg.sh:
# Запускаем ffserver
/usr/bin/ffserver;
# Запускаем ffmpeg
/usr/bin/ffmpeg -s 4cif -y -an -r 4 -f mjpeg -i http://127.0.0.1:8081/stream.mjpg http://IP-АДРЕС:8080/feed1.ffm &
stop_ffmpeg.sh:
# Для простоты...8)
killall ffserver;
killall ffmpeg;
5. HTML-код для просмотра:
Смотреть видео мы будем через FLV-плеер, например, Flowplayer.
index.html
<head>
<title>
Тестовое видео
</title>
<script type="text/javascript" src="swfobject.js"></script>
</head>
</html>
<body>
<div id="mplayer">Movie</div>
<script type="text/javascript">
var so = new SWFObject('FlowPlayerLight.swf','player','698','600','7');
so.addVariable("config", "{videoFile: http://IP-АДРЕС:8080/test.flv'', showMenu: false, showFullScreenButton: false, showVolumeSlider: false,
so.write('mplayer');
</script>
</div>
<body>
FlowPlayerLight.swf можно взять здесь. Библиотеку swfobject.js — здесь.
Можно, конечно, и просто встроить FLV-плеер в HTML-код через Embed и Object.
Очень важное замечание: скорее всего придется поиграться c framerate, bitrate и другими параметрами в ffserver.conf и в скрипте запуска. Мне пришлось долго повозиться, подбирая более менее нормальные значения, поскольку возникали проблемы с проигрыванием потока в FLV-плеере.
6. Теперь все готово к пробному запуску:
Запускаем motion
Запускаем ffserver и ffmpeg
Открываем в браузере index.html и смотрим, показывается ли изображение с камеры.
В заключение, хочется отметить, что, все-таки, такая схема не является широковещательной. Т.е. каждый подключенный клиент будет «кушать» кусок полосы канала равный битрейту видео. Я пока не разбирался, можно ли организовать таким образом broadcasting или multicasting, поскольку это немного вне моей компетенции…8) Но думаю, что при определенном усилии это можно сделать. Также к недостаткам можно отнести довольно высокий битрейт (сколько я ни пытался, получить видео хотя бы в районе 500 kbit/sec, в нормальном качестве, и приемлемой частотой обновления не получилось).
Ссылки:
У вас нет идей, как можно сохранять flv поток.
А какой из вариантов вам самому нравится больше, вещание через ffserver или vlc и почему?
Насчет сохранения flv-потока могу сказать, что передо мной такой задачи не стояло, хотя это наверняка можно легко сделать с помощью duplicate. Что касается моих личных предпочтений, то в качестве потокового сервера мне больше по душе VLC, поскольку, насколько мне известно, ffserver до сих пор кривоват и староват. По личному опыту могу сказать, что ни тот, ни другой 100%-ым аптаймом не обладают и, все-таки, периодически вылетают. ffserver даже чаще. Поэтому приходилось добавлять watchdog’и. Хотя на последний момент, VLC уже вещает пару недель без сбоев. Какой способ использовать — решать Вам. В конце концов можно купить и Wowza Media Server или Adobe FMS. Я же искал решение среди открытых продуктов и рад, что хоть что-то нашел..8)
Советую из открытых продуктов попробовать вещать через erlyvideo.org он сможет принять стрим и отправить его флеш-клиентам.
А будет ли такая страничка нормально отображаться в мобильных браузерах, поддерживающих флэш, например андроид и айфон?
спасибо очень интересная статья, есть камера dcs 3420 хотелось бы сделать нечто подобное, но необходимо чтоб был звук со встроенного микрофона, есть идеи как это реализовать?
у меня данная конфигурация заработала только после установки модуля vlookback
# m-a a-i vloopback
# modprobe vloopback
этот модуль создаёт виртуальное устройств видеозхвата (/dev/video0), без этого motion выдавал картинку «unable to open video device since …»
ffmpeg выдает:
Input #0, mjpeg, from 'http://127.0.0.1:8081/stream.mjpg':
Duration: N/A, bitrate: N/A
Stream #0.0: Video: mjpeg, yuvj420p, 640x480 [PAR 1:1 DAR 4:3], 4 fps, 4 tbr, 1200k tbn, 1200k tbc
Segmentation fault
Не подскажите, как с этим бороться?
Смог запустить так:
Но стрим пустой. VLC по адресу http://IP-АДРЕС:8080/test.flv ничего не воспроизводит…