В этот раз я поделюсь рабочим решением для организации видеотрансляции в основе которого лежит связка Red5 и steamStream. Red5 — это RTMP-сервер с открытым исходным кодом, а steamStream — приложение Red5, которое по сути является рестримером RTP в RTMP. В качестве вспомогательных, но не менее важных «рабочих лошадок» будут выступать VLC и Xuggler (работа с видео при помощи Java).
Этот вариант трансляции, на мой взгляд, более «правильный» по сравнению со способом трансляции через VLC, описанным ранее, поскольку использует протокол RTMP, а не гонит FLV напрямую. Недостатки тоже есть: сложное решение, необходимость компиляции steamStream, и работает с Red5 до определенной ревизии SVN (было выяснено опытным путем).
Исходная система:ОС Debian Squeeze и камера Axis с MPEG-4 видео.
1. Установка VLC
# Подготовка
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:
# Не знаю, как на данный момент, но подозреваю, что ситуация осталась та же.
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:
chmod +x xuggle-xuggler.3.4.1012-i686-pc-linux-gnu.sh
./xuggle-xuggler.3.4.1012-i686-pc-linux-gnu.sh
Добавить
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.setVideoHeight(HEIGHT);
где WIDTH,HEIGHT — размер картинки с камеры
ReStreamer.java:
...
private final int frNumerator = FPS;
где TSINTERVAL должно быть равным 1000000/FPS, например, если FPS = 10 кадров в сек., то TSINTERVAL = 100000. FPS — частота кадров видео с камеры.
Компилируем steamStream:
ant compile
# Должно получиться «BUILD SUCCESSFUL»
5. Запуск red5:
Проверяем логи в /usr/lib/red5/log/ на наличие ошибок.
6. Запуск VLC:
Создаем файл /home/ipcam/config со следующим содержанием:
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 со следующим содержанием:
Запускаем и проверяем наличие файла /usr/lib/red5/webapps/steamStream/sdpdescriptors/stream.sdp
К сожалению, и VLC имеет свойство иногда вырубаться, поэтому для стабильности лучше всего написать watchdog
.
7. Интеграция в HTML:
wget http://www.longtailvideo.com/jw/upload/mediaplayer.zip
# Распаковываем и кладем файлы player.swf и swfobject.js в один каталог с предполагаемой
# HTML-страницей, где будем показывать видео
Добавляем следующий HTML-код в страницу:
<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&provider=rtmp&file=stream.flv&bufferlength=0&autostart=true&controlbar=none&displayclick=fullscreen');
so.write('mplayer');
// ]]>
</script>
Открываем страничку и смотрим. Если видео не пошло — проверяем логи в /usr/lib/red5/log/.
P.S. В скором времени собираюсь также проверить вариант использования еще одного RTMP-сервера — Erlyvideo, который активно и с энтузиазмом на данный момент разрабатывается.
Ссылки: