magnify
Home arrow Администрирование arrow Организация видеотрансляции на сайте. VLC+Red5+Xuggler+steamStream.
formats

Организация видеотрансляции на сайте. VLC+Red5+Xuggler+steamStream.

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

В этот раз я поделюсь рабочим решением для организации видеотрансляции в основе которого лежит связка Red5 и steamStream. Red5 — это RTMP-сервер с открытым исходным кодом, а steamStream — приложение Red5, которое по сути является рестримером RTP в RTMP. В качестве вспомогательных, но не менее важных «рабочих лошадок» будут выступать VLC и Xuggler (работа с видео при помощи Java).

Этот вариант трансляции, на мой взгляд, более «правильный» по сравнению со способом трансляции через VLC, описанным ранее, поскольку использует протокол RTMP, а не гонит FLV напрямую. Недостатки тоже есть: сложное решение, необходимость компиляции steamStream, и работает с Red5 до определенной ревизии SVN (было выяснено опытным путем).

Исходная система:ОС Debian Squeeze и камера Axis с MPEG-4 видео.

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

# !!! НЕ ЗАБУДЬТЕ ДОБАВИТЬ РЕПОЗИТОРИЙ DEBIAN-MULTIMEDIA В APT !!!
# Подготовка
cd /usr/local/src
apt-get install make automake g++ gcc autoconf ffmpeg lua5.1 liblua5.1-0-dev libtag1-dev \
libdvbpsi-dev libcdio-dev libvcdinfo-dev libcddb2-dev libmad0-dev libavcodec-dev libavutil-dev \
libavformat-dev  libswscale-dev libpostproc-dev libfaad-dev liba52-0.7.4-dev libmpeg2-4-dev \
libzvbi-dev libflac-dev
# Установка liveMedia
wget http://www.live555.com/liveMedia/public/live555-latest.tar.gz
tar -xvzf live555-latest.tar.gz
cd live
./genMakefiles linux
make
cd /usr/local/src
cp -r live/ vlc-1.1.0/extras/
# VLC
wget http://download.videolan.org/pub/videolan/vlc/1.1.0/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
./configure --enable-faad --disable-remoteosd --disable-qt4 --disable-skins2 --disable-activex \
--disable-v4l2 --disable-libv4l2 --disable-xvideo --disable-glx --disable-opengl --disable-visual \
--enable-realrtsp --enable-flac --with-live555-tree=extras/live \
--disable-dbus --disable-xcb > /tmp/1 2> /tmp/2
# В файле /tmp/2 можно будет смотреть ошибки и предупреждения процесса конфигурирования
# Если будет какая-нибудь ошибка, то необходимо установить соответствующий пакет Debian и
# запустить configure еще раз
make
adduser ipcam
cp -r /usr/local/src/vlc-1.1.0 /home/ipcam/vlc
chown -R /home/ipcam/vlc ipcam:ipcam
#!Запускать vlc от пользователя ipcam!

2. Установка Red5:

# Пакет собранный из исходников Red5 ревизии 3894 из SVN. Более поздние сборки не работали.
# Не знаю, как на данный момент, но подозреваю, что ситуация осталась та же.
wget http://flance.onego.ru/files/red5/red5_0.9.0-r3894_all.deb
dpkg -i red5_0.9.0-r3894_all.deb

3. Установка Xuggler:

wget http://com.xuggle.s3.amazonaws.com/xuggler/xuggler-3.4.FINAL/xuggle-xuggler.3.4.1012-i686-pc-linux-gnu.sh
chmod +x xuggle-xuggler.3.4.1012-i686-pc-linux-gnu.sh
./xuggle-xuggler.3.4.1012-i686-pc-linux-gnu.sh

Добавить

export XUGGLE_HOME=/usr/local/xuggler
export LD_LIBRARY_PATH=$XUGGLE_HOME/lib:$LD_LIBRARY_PATH
export PATH=$XUGGLE_HOME/bin:$PATH

в начало /usr/lib/red5/red5.sh

4. Установка steamStream:

# Подгототвка
# Не забыть, что sun-java6-jdk находится в non-free пакетах
apt-get install sun-java6-jdk ant
# steamStream
wget  http://flance.onego.ru/files/steamStream/steamStream.tar.gz
tar -xvzf steamStream.tar.gz
cp -r steamStream /usr/lib/red5/webapps
chown -R ipcam:ipcam /usr/lib/red5/webapps/steamStream/sdpdescriptors
# Jetm - необходимо для запуска
wget "http://downloads.sourceforge.net/project/jetm/jetm/jetm-1.2.3/jetm-1.2.3.tar.gz?use_mirror=citylan&ts=1280727327"
tar -xvzf jetm-1.2.3.tar.gz
cp jetm-1.2.3/lib/*.jar /usr/lib/red5/lib
# Копируем необходимы библиотеки для компиляции steamStream
cp /usr/local/xuggler/share/java/jars/xuggle-xuggler.jar /usr/lib/red5/lib
wget http://xuggle.googlecode.com/svn/trunk/repo/share/java/xuggle/xuggle-xuggler-red5/3.1.875.200908131110/xuggle-xuggler-red5-3.1.875.200908131110.jar
cp xuggle-xuggler-red5-3.1.875.200908131110.jar /usr/lib/red5/lib

Корректируем некоторые файлы в /usr/lib/red5/webapps/steamStream/WEB-INF/src/steamStream:

Application.java:

smf.setVideoWidth(WIDTH);
smf.setVideoHeight(HEIGHT);

где WIDTH,HEIGHT — размер картинки с камеры

ReStreamer.java:

private final long tsInterval = TSINTERVAL;
...
private final int frNumerator = FPS;

где TSINTERVAL должно быть равным 1000000/FPS, например, если FPS = 10 кадров в сек., то TSINTERVAL = 100000. FPS — частота кадров видео с камеры.

Компилируем steamStream:

cd /usr/lib/red5/webapps/steamStream/WEB-INF
ant compile
# Должно получиться «BUILD SUCCESSFUL»

5. Запуск red5:

/etc/init.d/red5 start

Проверяем логи в /usr/lib/red5/log/ на наличие ошибок.

6. Запуск VLC:

Создаем файл /home/ipcam/config со следующим содержанием:

new teststream broadcast enabled
setup teststream input <URL видеопотока с камеры>
setup teststream output "#rtp{dst=127.0.0.1,port=10000,sdp=file:///usr/lib/red5/webapps/steamStream/sdpdescriptors/stream.sdp}"
control teststream play

Создаем скрипт запуска /home/ipcam/start_vlc.sh со следующим содержанием:

/home/ipcam/vlc/vlc -vvv --sout-keep --no-rtsp-tcp -I telnet --extraintf logger --logfile=/home/ipcam/vlc.log --telnet-host=127.0.0.1 -R --udp-caching=5000 --rtsp-caching=1000 --http-caching=1000 --telnet-password=pass --vlm-conf /home/ipcam/config --repeat --no-drop-late-frames --no-skip-frames --no-ffmpeg-hurry-up --no-sout-transcode-hurry-up --rt-priority

Запускаем и проверяем наличие файла /usr/lib/red5/webapps/steamStream/sdpdescriptors/stream.sdp

К сожалению, и VLC имеет свойство иногда вырубаться, поэтому для стабильности лучше всего написать watchdog
.
7. Интеграция в HTML:

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

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

<script src="swfobject.js" type="text/javascript"></script>
<div id="mplayer">this will be replaced by the SWF.</div>
<script type="text/javascript">// <![CDATA[
var so = new SWFObject('player.swf','player','480','360','9');
so.addParam('allowfullscreen','true');
so.addParam('flashvars','streamer=rtmp://<адрес сервера с запущенным Red5>/steamStream&amp;provider=rtmp&amp;file=stream.flv&amp;bufferlength=0&amp;autostart=true&amp;controlbar=none&amp;displayclick=fullscreen');
so.write('mplayer');
// ]]>
</script>

Открываем страничку и смотрим. Если видео не пошло — проверяем логи в /usr/lib/red5/log/.

P.S. В скором времени собираюсь также проверить вариант использования еще одного RTMP-сервера — Erlyvideo, который активно и с энтузиазмом на данный момент разрабатывается.

Ссылки:

  1. http://www.videolan.org
  2. http://code.google.com/p/red5/
  3. http://red5wiki.com/wiki/SteamStream
  4. http://www.xuggle.com/xuggler/
  5. http://erlyvideo.org/
  6. http://www.live555.com/liveMedia
  7. http://www.longtailvideo.com/players/jw-flv-player
 
Просмотров: 30 683 | 34 комментария  comments 

34 комментария

  1. Serg

    А на ubuntu 10.04 данное руководство пойдет?

  2. Да, за исключением того, что некоторые пакеты могут называться по-другому и, возможно, vlc не надо будет собирать. Еще, cкорее всего, хорошо бы подключить Medibuntu. Могу точно сказать, что на Ubuntu у меня эта схема работала.

  3. Serg

    apt-get install sun-java6-jdk ant
    Чтение списков пакетов… Готово
    Построение дерева зависимостей
    Чтение информации о состоянии… Готово
    E: Не удалось найти пакет sun-java6-jdk

    Как с этим бороться?

  4. Добавить репозиторий Partner.

  5. flanauf

    Спасибо за статью.
    Все сделал по инструкции, но что-то не завелось. Когда открываю страницу с flash-плеером, то ничего не происходит, просто черный экран.
    В консоли появляется вот что:

    [INFO] [NioProcessor-1] org.red5.server.net.rtmp.RTMPHandler — Connecting to: [WebScope@1f5b4d1 Depth = 1, Path = ‘/default’, Name = ‘steamStream’]
    [ERROR] [NioProcessor-1] org.red5.server.service.ServiceInvoker — Method checkBandwidth with parameters [] not found in steamStream.Application@179b7b0
    [INFO] [NioProcessor-1] org.red5.server.net.rtmp.RTMPHandler — Remembering client buffer on stream: 0
    Bingo!

    [ERROR] [Thread-6] org.ffmpeg — [mpeg4 @ 0x8575e50] warning: first frame is no keyframe
    [ERROR] [Thread-6] org.ffmpeg — [mpeg4 @ 0x8575e50] internal error, slice end before start
    [WARN] [Thread-6] com.xuggle.xuggler — Got error: picture is not of the same width as this Coder (../../../../../../../csrc/com/xuggle/xuggler/StreamCoder.cpp:1204)
    [ERROR] [Thread-6] com.xuggle.xuggler — Error: attempt to write trailer, but at least one used codec already closed (../../../../../../../csrc/com/xuggle/xuggler/Container.cpp:739)

    Что делать, уже не знаю.

  6. Попробуйте использовать JW player версии постарее (4.1), или, например, FlowPlayer.

  7. Но вот странно, что вылазят ошибки Xuggler и не транскодируется поток MPEG-4.

  8. flanauf

    С JW player’ом версии 5.1 видео пошло. И очень хорошо. Спасибо.
    Только вот нет звука. Не подскажите, что можно сделать?

  9. С аудио не пробовал, но в Application.java есть код smf.setHasAudio(false);

    Попробуйте поменять на smf.setHasAudio(false);, затем перекомпилировать steamStream. Также можно посмотреть параметры vlc.

  10. flanauf

    Вы наверно имели ввиду поменять на smf.setHasAudio(true);
    Изменил, перекомпилировал и все стало как раньше, т.е. ошибки в консоли. Вернул обратно на smf.setHasAudio(false); и все равно ошибки. И не хочет запускаться. Видимо что-то с Xuggler’ом не так. Буду пробовать дальше…

  11. Да, конечно, поменять на true. Насчет ошибок сложно что-либо посоветовать, поскольку с таким поведением Xuggler не встречался.

  12. хацкер

    Спасибо за статью. Дополню следующим:
    Из MPEG4-based есть есчо:
    — http://blogs.gnome.org/uraeus/2008/10/13/gstreamer-rtsp-server/ (не удалось пока завести, не знаю, но gstreamer внушает уважение)
    — http://www.wowzamedia.com/ (проприетарщина, но круто по докам)
    — http://erlyvideo.org/ (свободная, наш чувак делает на erlang-e, не дошли ещё руки)
    Для невысоких фреймрейтов ( < 5 fps) думаю можно обойтись без флеша, подойдут MJPEG/JPEG решения:
    — www.zoneminder.com (забирать может по rtsp, отдавать нет)
    — http://www.lavrsen.dk/twiki/bin/view/Motion/WebHome (самое простое решение)
    — http://avreg.net (только deb, заводиться с пол пинка, но проприетарщина)

  13. angel

    Добрый день! При сборке VLC после compile ни одной ошибки, только несколько warning, но после make выдаётся ошибка

    /usr/bin/ld: /usr/local/src/vlc-1.1.0/extras/live/liveMedia/libliveMedia.a(Media.o): relocation R_X86_64_32S against `vtable for Medium’ can not be used when making a shared object; recompile with -fPIC
    /usr/local/src/vlc-1.1.0/extras/live/liveMedia/libliveMedia.a: could not read symbols: Bad value
    collect2: ld returned 1 exit status
    make[5]: *** [liblive555_plugin.la] Ошибка 1
    make[5]: Leaving directory `/usr/local/src/vlc-1.1.0/modules/demux’
    make[4]: *** [all-recursive] Ошибка 1
    make[4]: Leaving directory `/usr/local/src/vlc-1.1.0/modules/demux’
    make[3]: *** [all] Ошибка 2
    make[3]: Leaving directory `/usr/local/src/vlc-1.1.0/modules/demux’
    make[2]: *** [all-recursive] Ошибка 1
    make[2]: Leaving directory `/usr/local/src/vlc-1.1.0/modules’
    make[1]: *** [all-recursive] Ошибка 1
    make[1]: Leaving directory `/usr/local/src/vlc-1.1.0′
    make: *** [all] Ошибка 2

    в чём может быть проблема?

  14. Возможно опять проблема с LiveMedia. Попробуйте взять версию постарее.

  15. abo

    на этапе подготовки пишет:
    =
    не удалось найти пакет libdvbpsi-dev (
    =

  16. Установочные пакеты приведены для Debian Squeeze. Если ОС другая, то нужно найти альтернативы.

  17. angel

    Доброго времени суток.
    отсутствие make install при сборке VLC — это опечатка или так и должно быть? И почему тогда так должно быть?
    И каков смысл создания юзера ipcam (кроме очевидного — запуска всех приложений от отдельного юзера)?
    Спасибо.

  18. Нет, в моем случае это не опечатка. Можно и make install сделать, если все ОК, и VLC запускается на ура..8) Можно и использовать любого юзера, кроме root, поскольку от root’a VLC не запустится (без необходимого ключа на этапе сборки), да и не надо этого.

  19. angel

    Не могли бы вы прокомментировать эту строчку в /home/ipcam/config
    setup teststream input

    вот есть у меня usb-камера, и откуда брать это url? извините за глупость вопроса, если что.

    и ещё: вот есть DVsvitch, который вроде как лучше подходит, если есть профессиональная камера с firewire интерфейсом, или камер две. как в данном случае вписать эту программу в вашу цепочку?

  20. Эта строчка в файле конфигурации означает откуда брать видеопоток с камеры. Подробнее об этом и о нескольких потоках на http://www.videolan.org/doc/streaming-howto/en/ch05.html.

    По поводу захвата с USB-камеры и подобного необходимо смотреть в документации VLC.

  21. angel

    при запуске vlc получил
    error while loading shared libraries: libvlc.so.5: cannot open shared object file: No such file or directory

    на форумах людям с этой проблемой советуют
    sudo ln -s /usr/local/lib/libvlc* /usr/lib/
    sudo ln -s /usr/local/lib/libx264.a /usr/lib/
    sudo ln -s /usr/local/lib/vlc /usr/lib/vlc

    но у меня этих библиотек там нет, поискал по всему компу — так и не нашёл.

  22. Dim

    Скажите, а для чего в этой связке VLC? Я так понял, для кодирования в нужный формат и передачи в RED5. Спрашиваю по той причине, что VLC порой частенько вылетает, и возможно проще было бы отдать эту работу именно ffmpeg для лучшей стабильности?

  23. Скорее всего, можно и ffserver+ffmpeg для этого дела использовать.

  24. Александр

    Кто знает — существуют ли на сегодня модули для
    транскодирования звука из g.711a (pcma) в AAC

    Я на сегодняшний день установил для тестирования earlyvideo , но он
    не принимает g.711a кодек.

    Нужно организовать транскодирование звука в rtsp видеопотоке в реальном времени из g.711a (pcma) в AAC.
    И запись потока на винт в определенный раздел + разбивка записи по фрагментам по 500 Мб +
    обозначение записанных фрагментов с указанием времени даты сохранения (для удобного поиска нужного фрагмента)

    Готов заплатить в пределах разумного.

    Жду предложений.
    ICQ : 394-092-168
    Skype : Kulibinorsk

  25. Михаил

    с JwPlayer-ом возникли проблемы сразу. Он отказывался воспроизводить поток по ервому щелчку. Только после 2-3-го щелчка нормально работал.
    Повозиля с uppod-ом. Работает отменно. Привожу код (только flashvars ибо все остальное по умолчанию можно задать в настройках на сайте uppod-а):
    param name=»flashvars» value=»streamer=rtmp://IP.IP.IP.IP/steamStream&provider=rtmp&file=rtmp://IP.IP.IP.IP/steamStream/stream&st=http://
    wow.sevlush.net/upstyles/video52-573.txt&bufferlength=0&autostart=true&controlbar=none&displayclick=fullscreen»

  26. Роман

    Народ помогите с vlc — при запуске ругается что не может найти плагин plugins-04041e-1f8.dat
    Второй вопрос какой поток с камеры аксис использовал автор? такой: axrtsp:///axis-media/media.amp ???

  27. Роман

    Народ положите ктонь рабочую версию сборки в vmware на трекер… Зачем мучать людей косяками?

  28. Александр

    Подскажите, это решение подойдет для вещания с нескольких камер?

  29. Андрей

    Добрый день!
    Есть предложение о сотрудничестве касающегося использования RED5…
    если интересно, дайте адресок для связи…

  30. Анжелика

    Здравствуйте!
    Прошу помочь за разумную плату. Установлен компонент конференции вот разработчик http://www.videowhisper.com/?p=Video+Conference
    Перевела все мануалы, но не могу разобраться, нет пошаговой инструкции, куда и что ставить? Кроме модуля и компонента необходимо поднять сервер. Приобрела выделенный сервер VPS для этих целей, но не поняла ничего по установке red5.
    с ув. Анжелика

  31. none

    первая ошибка призапуску vcl это директория я не правильно запускаю vcl?

  32. /home/ipcam/vlc/vlc, поправил. Рекомендую обратить внимание на erlyvideo или nginx-rtmp-module. Этот пост уже несколько устарел.

  33. none

    не я просто vlc вместа патча анписал написал и заработало и отдельно установил vlc страно что он не был установлен или что

  34. none

    я запустил но в наличии файла что то невижу страно
    /usr/lib/red5/webapps/steamStream/sdpdescriptors/stream.sdp в чем дело?

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

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