magnify
Home arrow Администрирование arrow Передача видео с IP-камер D-Link
formats

Передача видео с IP-камер D-Link

Опубликовано: 22.05.2008 Автор: в

Недавно столкнулся с проблемой получения и передачи потокового видео с IP-камеры D-Link 6620G. Обнаружилось, что эта камера (как и все камеры D-Link, как мне ответил сотрудник на официальном форуме) не отдает видеопоток напрямую ни по UDP, ни по HTTP в чистом виде, что меня очень неприятно удивило. С камерой можно работать только через ActiveX-компонент, т.е. только в IE. Единственное, что можно получить — это текущий кадр через cgi-bin/video.jpg. Но задача как раз была организовать раздачу через Web. Что ж, после некоторых размышлений мне удалось это сделать, организовав следующую схему:

Общая схема

Работать это должно было следующим способом:

  1. С камеры формируется MJPEG-поток, забирая текущий кадр /cgi-bin/video.jpg. Для этого используется детектор Motion. Этот программное решение подкупило меня своей легковесностью, быстротой, а также довольно гибкой функциональностью.
  2. Далее ffmpeg конвертирует MJPEG-поток в flv и отдает flv-поток с помощью ffserver.
  3. В нужную HTML-страничку встраивается FLV-плеер, который и показывает картинку.

Опишу подробнее процесс установки и конфигурирования этого добра на Debian 4.0:

1. Подготовка:
Добавляем в /etc/apt/sources.list репозиторий debian-multimedia

deb http://www.debian-multimedia.org stable main
deb-src http://www.debian-multimedia.org etch main

Устанавливаем пакеты

apt-get update
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:

# Порт, ка котором будет слушать ffserver и отдавать flv-поток
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:

#!/bin/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:

#!/bin/sh

# Для простоты...8)
killall ffserver;
killall ffmpeg;

5. HTML-код для просмотра:
Смотреть видео мы будем через FLV-плеер, например, Flowplayer.
index.html

<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

/etc/init.d/motion start

Запускаем ffserver и ffmpeg

./start_ffmpeg.sh

Открываем в браузере index.html и смотрим, показывается ли изображение с камеры.

В заключение, хочется отметить, что, все-таки, такая схема не является широковещательной. Т.е. каждый подключенный клиент будет «кушать» кусок полосы канала равный битрейту видео. Я пока не разбирался, можно ли организовать таким образом broadcasting или multicasting, поскольку это немного вне моей компетенции…8) Но думаю, что при определенном усилии это можно сделать. Также к недостаткам можно отнести довольно высокий битрейт (сколько я ни пытался, получить видео хотя бы в районе 500 kbit/sec, в нормальном качестве, и приемлемой частотой обновления не получилось).

Ссылки:

  1. http://forum.dlink.ru
  2. http://www.lavrsen.dk/twiki/bin/view/Motion/WebHome
  3. http://ffmpeg.mplayerhq.hu/
  4. http://en.wikipedia.org/wiki/Webcast
  5. http://en.wikipedia.org/wiki/Motion_JPEG
  6. http://www.videolan.org/vlc
  7. http://flowplayer.org
  8. http://blog.deconcept.com/swfobject
 
Просмотров: 27 559 | 8 комментариев  comments 

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

  1. Ivan

    У вас нет идей, как можно сохранять flv поток.
    А какой из вариантов вам самому нравится больше, вещание через ffserver или vlc и почему?

  2. Насчет сохранения flv-потока могу сказать, что передо мной такой задачи не стояло, хотя это наверняка можно легко сделать с помощью duplicate. Что касается моих личных предпочтений, то в качестве потокового сервера мне больше по душе VLC, поскольку, насколько мне известно, ffserver до сих пор кривоват и староват. По личному опыту могу сказать, что ни тот, ни другой 100%-ым аптаймом не обладают и, все-таки, периодически вылетают. ffserver даже чаще. Поэтому приходилось добавлять watchdog’и. Хотя на последний момент, VLC уже вещает пару недель без сбоев. Какой способ использовать — решать Вам. В конце концов можно купить и Wowza Media Server или Adobe FMS. Я же искал решение среди открытых продуктов и рад, что хоть что-то нашел..8)

  3. Макс Лапшин

    Советую из открытых продуктов попробовать вещать через erlyvideo.org он сможет принять стрим и отправить его флеш-клиентам.

  4. Алексей

    А будет ли такая страничка нормально отображаться в мобильных браузерах, поддерживающих флэш, например андроид и айфон?

  5. kos

    спасибо очень интересная статья, есть камера dcs 3420 хотелось бы сделать нечто подобное, но необходимо чтоб был звук со встроенного микрофона, есть идеи как это реализовать?

  6. const

    у меня данная конфигурация заработала только после установки модуля vlookback
    # m-a a-i vloopback
    # modprobe vloopback
    этот модуль создаёт виртуальное устройств видеозхвата (/dev/video0), без этого motion выдавал картинку «unable to open video device since …»

  7. Александр

    ffmpeg выдает:

    Seems stream 0 codec frame rate differs from container frame rate: 1200000.00 (1200000/1) -> 4.00 (4/1)
    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

    Не подскажите, как с этим бороться?

  8. Александр

    Смог запустить так:

    avconv -f mjpeg http://127.0.0.1:8081/stream.mjpg -acodec copy -vcodec copy http://192.168.100.5:8080/feed1.ffm

    Но стрим пустой. VLC по адресу http://IP-АДРЕС:8080/test.flv ничего не воспроизводит…

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *