magnify
Home arrow Posts tagged "ffmpeg"
formats

Организация видеотрансляции на сайте. VLC+Erlyvideo+HLS+nginx.

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

Сегодняшний пост будет посвящен достаточно стабильному способу организации видеотрансляции на сайте. Для транскодирования и записи в очередной раз будем использовать VLC. В качестве RTMP-сервера задействуем Erlyvideo, ядро которого распространяется под лицензией GPL. В одной из предыдущих записей я уже описывал возможное решение с использованием Red5. Запись оказалась довольно интересной, поэтому теперь предложу еще одно решение с учетов современных тенденций и инструментов.

Приведу общую схему, где в качестве примеры указаны IP-камеры c видеопотоками в MPEG-4 и H264:

Схема трансляции

Как видно на диаграмме, для транскодирования используется VLC, а H264-поток забирается Erlyvideo напрямую, благо это он умеет. Для организации HTTP Live Streaming также используется VLC, настройки которого мы увидим ниже.

По традиции, детали установки приведу для Debian Squeeze 6.0 amd64, поскольку для этой архитектуры существует репозиторий Erlyvideo. Сразу оговорюсь, трансляция в примерах ведется без звука.

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

deb http://www.deb-multimedia.org squeeze main non-free
deb-src http://www.debian-multimedia.org squeeze main non-free

/etc/apt/sources.list.d/erlyvideo.list

deb http://debian.erlyvideo.org binary/

/etc/apt/sources.list.d/nginx.list

deb http://nginx.org/packages/debian/ squeeze nginx
deb-src http://nginx.org/packages/debian/ squeeze nginx

Обновляем репозитории

apt-get update

Обращаю ваше внимание, что репозиторий Erlyvideo добавлен для будущего обновления Debian до Wheezy, т.к. последняя версия Erlyvideo из пакетов ставится только на эту версию дистрибутива.

2. Установка ffmpeg, libvpx, fdk-aac, x264, openssl

apt-get install make automake g++ gcc autoconf lua5.1 liblua5.1-0-dev libtag1-dev \
libdvbpsi-dev libcdio-dev libvcdinfo-dev libcddb2-dev libmad0-dev libfaad-dev liba52-0.7.4-dev \
libmpeg2-4-dev libzvbi-dev libflac-dev libdca-dev libdirac-dev libdvdnav-dev libdvdread-dev libfaac-dev \
libgcrypt11-dev libgnutls-dev libgpac-dev libiso9660-dev libjpeg62 libltdl-dev libmp3lame-dev \
libmodplug-dev libpng12-dev libraw1394-dev libschroedinger-dev libspeex-dev libtag1-dev \
libtasn1-3-dev libtheora-dev libtwolame-dev libvcdinfo-dev libvorbis-dev build-essential \
librtmp-dev checkinstall git libopencore-amrnb-dev libopencore-amrwb-dev pkg-config yasm zlib1g-dev

# x264
cd /usr/local/src
git clone --depth 1 git://git.videolan.org/x264
cd x264
./configure --enable-pic --enable-shared
make
sudo checkinstall --pkgname=x264 --pkgversion="3:$(./version.sh | \
awk -F'[" ]' '/POINT/{print $4"+git"$5}')" --backup=no --deldoc=yes \
--fstrans=no --default

# fdk-aac
cd /usr/local/src
git clone --depth 1 git://github.com/mstorsjo/fdk-aac.git
cd fdk-aac
autoreconf -fiv
./configure --with-pic --enable-shared
make
sudo checkinstall --pkgname=fdk-aac --pkgversion="$(date +%Y%m%d%H%M)-git" --backup=no \
--deldoc=yes --fstrans=no --default

# libvpx
cd /usr/local/src
git clone --depth 1 http://git.chromium.org/webm/libvpx.git
cd libvpx
./configure --enable-pic --enable-shared --disable-unit-tests
make
sudo checkinstall --pkgname=libvpx --pkgversion="1:$(date +%Y%m%d%H%M)-git" --backup=no \
--deldoc=yes --fstrans=no --default

# ffmpeg
cd /usr/local/src
git clone --depth 1 git://source.ffmpeg.org/ffmpeg
cd ffmpeg
./configure --enable-gpl --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb \
--enable-libopencore-amrwb --enable-librtmp --enable-libtheora --enable-libvorbis \
--enable-libvpx --enable-libx264 --enable-nonfree --enable-version3 --enable-pic --enable-shared
make
sudo checkinstall --pkgname=ffmpeg --pkgversion="5:$(date +%Y%m%d%H%M)-git" --backup=no \
--deldoc=yes --fstrans=no --default

# openssl
# !!!ДЛЯ КОРРЕКТНОЙ РАБОТЫ ERLYVIDEO на Debian Squeeze!!!
# !!! Для Debian Wheezy можно apt-get install libssl1.0.0 !!!
cd /usr/local/src
wget http://www.openssl.org/source/openssl-1.0.1c.tar.gz
tar -xvzf openssl-1.0.1c.tar.gz
cd openssl-1.0.1c
./config --prefix=/usr zlib-dynamic --openssldir=/etc/ssl shared
make
sudo checkinstall --pkgname=openssl --pkgversion="5:$(date +%Y%m%d%H%M)-git" --backup=no \
--deldoc=yes --fstrans=no --default

hash x264 ffmpeg ffplay ffprobe
ldconfig

3. Установка VLC

cd /usr/local/src
wget http://download.videolan.org/pub/videolan/vlc/2.0.3/vlc-2.0.3.tar.xz
tar -xvJf vlc-2.0.3.tar.xz
cd vlc-2.0.3/contrib
mkdir native
cd native
../bootstrap
make .live555
cd /usr/local/src/vlc-2.0.3
./configure --enable-faad --disable-pulse --disable-alsa --disable-qt4 --disable-skins2 --disable-v4l2 \
--disable-xvideo --disable-glx --disable-visual --enable-realrtsp --enable-flac --disable-dbus \
--disable-xcb > /tmp/1 2> /tmp/2
# В файле /tmp/2 можно будет смотреть ошибки и предупреждения процесса конфигурирования
# Если будет какая-нибудь ошибка, то необходимо установить соответствующий пакет Debian и
# запустить configure еще раз
make
adduser ipcam
cp -r /usr/local/src/vlc-2.0.3 /home/ipcam/vlc
chown -R ipcam:ipcam /home/ipcam/vlc
#!Запускать vlc от пользователя ipcam!

4. Установка nginx

apt-get install nginx

5. Установка Erlyvideo

#!!! Если установлен Debian Wheezy, то apt-get install erlyvideo должно сработать
cd /usr/local/src/
wget http://debian.erlyvideo.org/binary/erlyvideo_2.10.18_amd64.deb
dpkg -i --force-depends erlyvideo_2.10.18_amd64.deb

6. Конфигурация VLC
Создаем скрипт /home/ipcam/start_vlc.sh (не забудьте поменять CONTROLPASSWORD):

#!/bin/sh
/home/ipcam/vlc/vlc -vv --sout-keep -I telnet --telnet-host=127.0.0.1 -R \
--udp-caching=1000 --http-caching=1000 --telnet-password=CONTROLPASSWORD \
--vlm-conf /home/ipcam/config --repeat --no-ffmpeg-hurry-up --no-sout-transcode-hurry-up \
--rt-priority --http-reconnect --sout-transcode-high-priority --loop --no-play-and-stop \
--extraintf logger --logfile=/var/log/vlc/vlc.log --no-sout-audio \
--network-caching=3000 --sout-mux-caching=1000

Для простоты и удобства запуска будем использовать VLM. Файл /home/ipcam/config:

# MPEG-4 IP-камера
new mpeg4mux broadcast enabled
# H264 IP-камера
new h264mux broadcast enabled

setup mpeg4mux input "URL видеопотока камеры, например, rtsp://x.x.x.x/mpeg4/media.amp"
setup h264mux input "URL видеопотока камеры, например, rtsp://x.x.x.x/live/ch00_0"

# !!!Замените, где нужно СЕРВЕР!!!
# Пример транскодирования MPEG-4 в AVC + HLS
# Вероятнее всего, что параметры, наподобие vb, width, height, fps необходимо будет поднастроить.
setup mpeg4mux output '#transcode{vcodec=h264,venc=x264{cabac=yes,nf=yes,chroma-me=yes,partitions=-parti8x8-parti4x4-partp8x8-partb8x8,me=dia,keyint=15,min-keyint=8,scenecut=0,ipratio=0.71,bframes=0,qcomp=0.6,qpmin=10,qpmax=51,qpstep=4,ref=1,direct=auto,trellis=0,bpyramid=no,mixed-refs=no,weightb=no,8x8dct=no,fast-pskip=yes,mbtree=no,weightp=0,aq-mode=0,lookahead=0},vb=800,width=480,height=360,acodec=none,fps=15}:duplicate{dst="std{access=http,mux=ts,dst=:9090}",dst="std{access=livehttp{seglen=15,delsegs=true,numsegs=5,index=/usr/share/nginx/html/mpeg4mux/video.m3u8,index-url=http://СЕРВЕР/mpeg4mux/video-######.ts},mux=ts{use-key-frames},dst=/usr/share/nginx/html/mpeg4mux/video-######.ts}"}'

# Пример HLS + запись трансляции в файл
setup h264mux output '#duplicate{dst=std{access=file{append},mux=ts,dst=/home/record/record.mp4},dst=std{access=livehttp{seglen=10,delsegs=true,numsegs=5,index=/usr/share/nginx/html/h264mux/video.m3u8,index-url=http://СЕРВЕР/h264mux/video-######.ts},mux=ts,dst=/usr/share/nginx/html/h264mux/video-######.ts}}'

сontrol mpeg4mux play
сontrol h264mux play

Создаем директории для записи логов VLC и устанавливаем права:

mkdir /var/log/vlc
chown ipcam /var/log/vlc

Поясню некоторые детали. Удобство запуска через VLM заключается в том, что при этом поднимается telnet-интерфейс управления потоками, который можно использовать как для вручную, так и, например, различными скриптами. Запуск самого VLC идет от пользователя ipcam, поскольку от root’а его запускать нежелательно. HTTP Live Streaming обеспечивается с помощью модуля livehttp. Что касается транскодирования, то тут полет фантазии среди параметров x264 практически безграничен, но скажу сразу, что пока данный набор параметров себя оправдывает. К сожалению, рекомендуемое разработчиками кодирование CRF+VBV c Erlyvideo у меня нормально не заработало. В остальном, сильно рекомендую ознакомиться с конфигурацией VLM и x264.

7. Конфигурация Erlyvideo
Правим секцию rewrite в файле /etc/erlyvideo/erlyvideo.conf:

...
{rewrite, [
% Пример для транскодированного потока
{"video1", mpegts, "http://localhost:9090"},
% Пример для H264-потока с IP-камеры AirCam Ubiquiti
{"video2", rtsp, "rtsp://x.x.x.x/live/ch01_0",[{timeout,5000}]}
]}
...

8. Конфигурация nginx
Для корректной работы HLS добавляем в /etc/nginx/mime.types:

...
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}

Создаем директории для файлов HLS:

mkdir /usr/share/nginx/html/mpeg4mux
mkdir /usr/share/nginx/html/h264mux
chown ipcam /usr/share/nginx/html/mpeg4mux /usr/share/nginx/html/h264mux

9. Запуск сервисов

su - ipcam -c "/home/ipcam/start_vlc.sh &"
/etc/init.d/nginx start
/etc/init.d/erlyvideo start

Смотрим логи и проверяем, что все запустилось нормально.

10. Вывод на HTML-страницу

# Скачиваем flash-плеер, я рекомендую JW FLV Media Player, но можно попробовать и другой
wget http://www.longtailvideo.com/jw/upload/mediaplayer.zip
# Распаковываем и кладем файлы player.swf, swfobject.js и jwplayer.js в один каталог с предполагаемой
# HTML-страницей, где будем показывать видео

HTML-код:

...
<div id="mplayer">This will be replaced by the SWF.</div>
<script type="text/javascript">// <![CDATA[
   jwplayer('mplayer').setup({
     width: 640,
     height: 480,
     bufferlength: 1,
     autostart: true,
     mute: true,
     controlbar: 'none',
     provider: 'rtmp',
     streamer: 'rtmp://<СЕРВЕР>',
     file: 'video1',
     <!-- или file: 'video2' -->
     modes: [
         {type: 'flash', src: 'player.swf'},
         {type: 'html5',
            config: {
               file: 'http://СЕРВЕР/mpeg4mux/video',
               <!-- или file: 'http://CЕРВЕР/h264mux/video' -->
               provider: 'http'
          }
       }
      ]
   });
// ]]></script>

...

11. TODO
Перечислю возможные улучшения, которые не будут лишними:

  1. Watchdog для проверки работспособности VLC, который будет перезапускать необходимые сервисы в случае потери потоков с камер
  2. Создание плейлиста для JW Player
  3. Logrotate для логов VLC
  4. Скрипт для организации архивов записей, реализуется через telnet-интерфейс VLC, задача не ахти простая, но интересная ;)

12. На будущее
На данный момент основными технологиями стриминга видео являются HTTP Live Streaming, вообще говоря, предназначенная для использования на устройствах Apple, вполне применимая в теории и на других устройствах, а также HTTP Dynamic Streaming от Adobe (в некотором смысле преемник RTMP).

Кроме того, сейчас активно развивается JW Player Adaptive Provider. К большому разочарованию, разработчики JW Player включили поддержку HLS для Flash в платные версии плеера. Что ж, будем ждать появления поддержки HLS на non-Apple устройствах, что позволит отказаться от RTMP. Для использования HDS, можно воспользоваться 3-ей версией Erlyvideo — Flussonic и его поддержкой HDS. Насколько я понял, в его ядро поддержка HLS не включена. Ну а наличие Open Source Media Framework позволяет создавать свои плееры для RTMP и HTTP-стриминга.

Ссылки:

  1. http://www.videolan.org
  2. http://erlyvideo.org/
  3. http://www.longtailvideo.com/players/jw-flv-player
  4. http://www.videolan.org/developers/x264.html
  5. http://deb-multimedia.org/
  6. http://www.debian.org/index.ru.html
  7. https://ffmpeg.org/trac/ffmpeg/wiki/UbuntuCompilationGuide
  8. https://developer.apple.com/resources/http-streaming/
  9. http://www.adobe.com/products/hds-dynamic-streaming.html
  10. http://nginx.org/ru/
 
Просмотров: 27 410 | 16 комментариев  comments 
formats

Организация видеотрансляции на сайте

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

В одном из моих прошлых постов для передачи потокового видео я использовал связку Motion+ffmpeg+ffserver. В принципе, это рабочий вариант, но по какой-то причине ffserver довольно «криво» работал в качестве HTTP-сервера для отдачи видео.

В этот раз мы попробуем пойти другим путем и организовать трансляцию IP-камеры на сайте с помощью VLC Media Player — кроссплатформенного видеоплеера, а также, что наиболее важно в нашем случае, сервера потокового вещания. Сразу оговорюсь, что в качестве формата трансляции был выбран Flash Video (flv). Причин несколько, но самая главная — наличие Flash-плеера в браузере у 99% процентов пользователей Интернет. Конечно, можно выбрать и другой контейнер, например ASF.

Поскольку IP-камера (AXIS), с которой предполагалось вещание выдавала видео в формате MPEG ES, то предварительно его надо было преобразовать в MPEG TS, чтобы потом его можно было транскодировать в FLV.

Общая схема трансляции показана на рисунке ниже.

Общая схема

В качестве TS Muxer, FLV Encoder и FLV Streamer и будет выступать VLC.

Технически же это будет реализовано таким образом, что TS Muxer будет посылать MPEG TS поток по HTTP на порт 8080, откуда его можно будет «забирать», транскодировать в FLV и слать по HTTP на порт 8081. Чтобы было более понятно, проиллюстрирую это примером. Предположим, что все будет происходить на одном сервере (хотя это абсолютно не обязательно). Тогда техническая реализация работы будет следующей:

Реализация

Приступим к реализации. Как обычно, детали установки приведу для Debian Etch 4.0. VLC будем собирать из исходников.

1. Подготовка:

# Устанавливаем необходимые для сборки пакеты
# !!! НЕ ЗАБУДЬТЕ ДОБАВИТЬ РЕПОЗИТОРИЙ DEBIAN-MULTIMEDIA В APT !!!
apt-get install ffmpeg libavformatcvs51 libavcodeccvs51 libavcodeccvs51-dev libavformatcvs51-dev \
libavutilcvs49-dev libavutilcvs49 libavahi-client3 libavahi-common-dev libpostproccvs51-dev  \
libswscalecvs0-dev libswscalecvs0 libxvidcore4-dev libxvidcore4 libx264-dev libx264-54 automake1.9 \
autoconf g++ gcc liba52-0.7.4-dev libdvbpsi3-dev libdvbpsi3 libfaad-dev libfaac-dev libfribidi-dev \
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

# Скачиваем и собираем LIVE555 Streaming Media
# !!! ВНИМАНИЕ !!! На 4.11.2009 vlc с последней версией live от 28.10.2009 не работает. Проверено.
# http://forum.videolan.org/viewtopic.php?f=13&t=66303
# У меня сохранилась более старая версия, поэтому загружаем отсюда:
wget http://flance.onego.ru/files/live/live.tar.gz
tar xvfz live.tar.gz
cd live
./genMakefiles linux
make

2. VLC:

# На время написания статьи самая свежая стабильная версия - 0.9.8a
wget http://download.videolan.org/pub/videolan/vlc/0.9.8a/vlc-0.9.8a.tar.bz2
bzip2 -d vlc-0.9.8a.tar.bz2
tar xvf vlc-0.9.8a.tar

3. Добавляем live555 в дерево исходных текстов VLC:

cd vlc-0.9.8a
cp -r $YOUR_LIVE555_BUILD_DIR extras

4. Собираем VLC:

# Поскольку мне не нужен был VLC с графическим интерфейсом на сервере, то использовались ключи, которые его не собирали
./configure --enable-release --enable-faad --disable-remoteosd --disable-qt4 --disable-skins2 \
--disable-activex --disable-v4l2 --disable-libv4l2 --disable-x11 --disable-xvideo --disable-glx \
--disable-opengl --disable-visual --enable-realrtsp --enable-flac --with-live555-tree=extras/live \
--disable-dbus --disable-hal > /tmp/1 2> /tmp/2
# В файле /tmp/2 можно будет смотреть ошибки и предупреждения процесса конфигурирования
# Если будет какая-нибудь ошибка, то необходимо установить соответствующий пакет Debian и
# запустить configure еще раз
make

5. Запускаем VLC TS Muxer:

./vlc -vv --no-rtsp-tcp rtsp://<URL потока> --rtsp-caching=10000 --no-sout-audio --sout \
'#std{access=http,dst=127.0.0.1:8080,mux=ts}'

6. Запускаем FLV encoder+streamer:

./vlc -vv http://127.0.0.1:8080 --loop --http-caching=10000 --sout \
'#transcode{vcodec=FLV1,vb=1024}:std{access=http{mime=video/x-flv},dst=:8081/stream.flv,mux=ffmpeg{mux=flv}}'

6. Интеграция в HTML:

# Скачиваем flash-плеер, я рекомендую JW FLV Media Player, но можно попробовать и другой
wget http://www.longtailvideo.com/jw/upload/mediaplayer.zip
# Распаковываем и кладем файлы  player.swf и swfobject.js в один каталог с предполагаемой
# HTML-страницей, где будем показывать видео

Добавляем следующий HTML-код в страницу:

<script type="text/javascript" src="swfobject.js"></script>
<div id="mplayer">this will be replaced by the SWF.</div>
<script type="text/javascript">
var so = new SWFObject('player.swf','player','459','375','9');
so.addParam('allowfullscreen','true');
so.addParam('flashvars','start=1&amp;repeat=always&amp;file=http://<адрес потока>&amp;bufferlength=0&amp;autostart=true&amp;displayclick=none&amp;mute=true');
so.write('mplayer');
</script>

Внимание! Параметры start (спасибо Кириллу) и repeat важны.
Все, можно проверять. Хочу еще отметить, что на данный момент VLC с текущей версией FFMPEG для в плане FLV кодирования не работает, поэтому я использовал пакеты Debian. Если кодек FLV1 не нужен, то можно собрать VLC и со свежими FFMPEG и X264.

04.11.2009 ОБНОВЛЕНИЕ:
Важная информация:
1. Для сборки на Debian Lenny 5.0 необходимо добавить в опции конфигурирования VLC на 4 шаге опции --disable-nls и --disable-mozilla, иначе вылезет ошибка о Buggy glibc version.
2. VLC с последней версией liveMedia не стартует. Смотрите комментарии в шаге 1.

Ссылки:

  1. http://www.videolan.org
  2. http://www.ffmpeg.org
  3. http://www.live555.com/liveMedia
  4. http://www.longtailvideo.com/players/jw-flv-player
 
Просмотров: 40 606 | 99 комментариев  comments 
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
 
Просмотров: 29 356 | 8 комментариев  comments