Понадобилось мне недавно завести на сайт шесть ip-камер AXIS 215. И поскольку я никогда не искал легких путей, для этого дела я выбрал написанный на java медиасервер Red5.
Сразу оговорюсь, что ни с ip-камерами, ни вообще с видео, ни тем более с медиасерверами я никогда до этого не работал. Яву не знаю, родственников за границей не имею.
В общем, схема получилась следующая:
RTSP поток с AXIS 215 - VLC - Red5 + SteamStream - JW Player. То есть VLC конвертирует rtsp в rtp, а SteamStream конвертирует rtp в rtmp, который потом раздает Red5, а играет практически любой flash-плеер (ну в моем случае JW Player). Вот такая курага.
Приступим:
Итак, в начале у меня была абсолютно чистая Ubuntu Server 11.04.
Ставим необходимые пакеты:
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
И ставим Java и ant:
apt-get install python-software-properties
add-apt-repository ppa:ferramroberto/java
apt-get update
apt-get install sun-java6-jdk ant
Качаем Live555 - библиотеку, которую использует VLC для стриминга:
сd /usr/local/src
wget http://www.live555.com/liveMedia/public/live555-latest.tar.gz
tar -xvzf live555-latest.tar.gz
cd live
./genMakefiles linux
make
Качаем 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
Копируем Live555 и пробуем сделать configure. Лично у меня с первого раза не получилось и пришлось доставлять lybcrypt. Для этого надо было добавить
deb http://archive.ubuntu.com/ubuntu/ lucid main restricted multiverse universe
deb http://archive.ubuntu.com/ubuntu/ lucid-updates main restricted multiverse universe
deb http://security.ubuntu.com/ubuntu lucid-security main restricted universe multiverse
в /etc/apt/sources.list. Далее:
apt-get update
apt-get install libgcrypt11-dev
cp -r live/ vlc-1.1.0/extras/
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
make
Добавляем пользователя ipcam для запуска VLC:
adduser ipcam
cp -r /usr/local/src/vlc-1.1.0 /home/ipcam/vlc
chown -R ipcam:ipcam /home/ipcam/vlc
Качаем и ставим сам Red5
cd /usr/local/src/
wget http://flance.onego.ru/files/red5/red5_0.9.0-r3894_all.deb
dpkg -i red5_0.9.0-r3894_all.deb
Ставим Xuggle для работы с видео в Java:
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
И добавляем в начало /usr/lib/red5/red5.sh
export XUGGLE_HOME=/usr/local/xuggler
export LD_LIBRARY_PATH=$XUGGLE_HOME/lib:$LD_LIBRARY_PATH
export PATH=$XUGGLE_HOME/bin:$PATH
Теперь качаем, распаковываем и складываем в нужные места SteamStream, Jetm и библиотечки Xuggle:
wget http://flance.onego.ru/files/steamStream/steamStream.tar.gz
tar -xvzf steamStream.tar.gz
cp -r steamStream /usr/lib/red5/webapps
wget "http://downloads.sourceforge.net/project/jetm/jetm/jetm-1.2.3/jetm-1.2.3.tar.gz?use_mirror=citylan&ts=1280727327"
mv jetm-1.2.3.tar.gz\?use_mirror\=citylan\&ts\=1280727327 jetm-1.2.3.tar.gz
tar -xvzf jetm-1.2.3.tar.gz
cp jetm-1.2.3/lib/*.jar /usr/lib/red5/lib
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
Возможно, приложение SteamStream и может транслировать несколько потоков rtmp из нескольких потоков rtp, но я, по крайней мере, заставить его так и не смог. Хотя очень старался. А поскольку сделать все нужно было "еще вчера", ковырять java-код у меня не было никакого желания. Я решил просто расклонировать SteamStream и вместо одного запускать шесть приложений. Это, несомненно, наикостыльнейший костыль, но выхода у меня не было. Поэтому я сделал
cd /usr/lib/red5/webapps/
cp SteamStream SteamStream2 и т.д.
Теперь (ура-ура!) в каждом приложении нужно внести небольшие изменения в код.
cd /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;
FPS — частота кадров видео с камеры. А TSINTERVAL равно 1000000/FPS.
Теперь, нужно чтобы каждое из запущенных SteamStream находились в своем скоупе. Поэтому в папках SteamStream2, SteamStream3 и т.д. надо в файле red5-web.properties поменять строку:
webapp.contextPath=/steamStream2 (3,4 и т.д)
А в web.xml поменять
<param-value>/steamStream2</param-value>
Теперь можно компилировать приложения. Все шесть штук по очереди:
cd /usr/lib/red5/webapps/steamStream/WEB-INF
ant compile
Далее нужно создать конфиги для всех шести камер и запустить шесть потоков VLC. Создаем файл /home/ipcam/cfg/stream1.cfg и пишем туда:
new stream1 broadcast enabled
setup stream1 input <url потока с камеры>
setup stream1 output "#rtp{dst=127.0.0.1,port=10000,sdp=file:///usr/lib/red5/webapps/steamStream/sdpdescriptors/stream1.sdp}"
control stream1 play
Важное замечание: в каждом из шести конфигов надо указать разные порты и папки для хранения sdp файла. То есть stream2.cfg выглядит следующим образом:
new stream2 broadcast enabled
setup stream2 input <url потока с камеры>
setup stream2 output "#rtp{dst=127.0.0.1,port=12000,sdp=file:///usr/lib/red5/webapps/steamStream2/sdpdescriptors/stream2.sdp}"
control stream2 play
Ну и далее по аналогии. Каждый процесс VLC запускается командой:
/home/ipcam/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/stream1.cfg --repeat --no-drop-late-frames --no-skip-frames --no-ffmpeg-hurry-up --no-sout-transcode-hurry-up --rt-priority
Красненьким - это чтобы не забыть, что нужно менять имя конфига для каждого процесса. Вот собственно и все. Чтобы поставить всю эту красоту на сайт, можно скачать JW Player и встроить в страницу код:
<div id="mediaplayer">JW Player goes here</div>
<script type="text/javascript" src="jwplayer.js"></script>
<script type="text/javascript">
jwplayer("mediaplayer").setup({
flashplayer: "player.swf",
width: '640',
height: '480',
file: "stream1.flv",
provider: "rtmp",
streamer: "rtmp://79.141.66.16/steamStream"
});
</script>
Вот такие пироги с котятами. Основные знания (или незнания) подчепрнуты мной отсюда, спасибо этому доброму человеку.
Сразу оговорюсь, что ни с ip-камерами, ни вообще с видео, ни тем более с медиасерверами я никогда до этого не работал. Яву не знаю, родственников за границей не имею.
В общем, схема получилась следующая:
RTSP поток с AXIS 215 - VLC - Red5 + SteamStream - JW Player. То есть VLC конвертирует rtsp в rtp, а SteamStream конвертирует rtp в rtmp, который потом раздает Red5, а играет практически любой flash-плеер (ну в моем случае JW Player). Вот такая курага.
Приступим:
Итак, в начале у меня была абсолютно чистая Ubuntu Server 11.04.
Ставим необходимые пакеты:
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
И ставим Java и ant:
apt-get install python-software-properties
add-apt-repository ppa:ferramroberto/java
apt-get update
apt-get install sun-java6-jdk ant
Качаем Live555 - библиотеку, которую использует VLC для стриминга:
сd /usr/local/src
wget http://www.live555.com/liveMedia/public/live555-latest.tar.gz
tar -xvzf live555-latest.tar.gz
cd live
./genMakefiles linux
make
Качаем 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
Копируем Live555 и пробуем сделать configure. Лично у меня с первого раза не получилось и пришлось доставлять lybcrypt. Для этого надо было добавить
deb http://archive.ubuntu.com/ubuntu/ lucid main restricted multiverse universe
deb http://archive.ubuntu.com/ubuntu/ lucid-updates main restricted multiverse universe
deb http://security.ubuntu.com/ubuntu lucid-security main restricted universe multiverse
в /etc/apt/sources.list. Далее:
apt-get update
apt-get install libgcrypt11-dev
cp -r live/ vlc-1.1.0/extras/
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
make
Добавляем пользователя ipcam для запуска VLC:
adduser ipcam
cp -r /usr/local/src/vlc-1.1.0 /home/ipcam/vlc
chown -R ipcam:ipcam /home/ipcam/vlc
Качаем и ставим сам Red5
cd /usr/local/src/
wget http://flance.onego.ru/files/red5/red5_0.9.0-r3894_all.deb
dpkg -i red5_0.9.0-r3894_all.deb
Ставим Xuggle для работы с видео в Java:
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
И добавляем в начало /usr/lib/red5/red5.sh
export XUGGLE_HOME=/usr/local/xuggler
export LD_LIBRARY_PATH=$XUGGLE_HOME/lib:$LD_LIBRARY_PATH
export PATH=$XUGGLE_HOME/bin:$PATH
Теперь качаем, распаковываем и складываем в нужные места SteamStream, Jetm и библиотечки Xuggle:
wget http://flance.onego.ru/files/steamStream/steamStream.tar.gz
tar -xvzf steamStream.tar.gz
cp -r steamStream /usr/lib/red5/webapps
wget "http://downloads.sourceforge.net/project/jetm/jetm/jetm-1.2.3/jetm-1.2.3.tar.gz?use_mirror=citylan&ts=1280727327"
mv jetm-1.2.3.tar.gz\?use_mirror\=citylan\&ts\=1280727327 jetm-1.2.3.tar.gz
tar -xvzf jetm-1.2.3.tar.gz
cp jetm-1.2.3/lib/*.jar /usr/lib/red5/lib
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
Возможно, приложение SteamStream и может транслировать несколько потоков rtmp из нескольких потоков rtp, но я, по крайней мере, заставить его так и не смог. Хотя очень старался. А поскольку сделать все нужно было "еще вчера", ковырять java-код у меня не было никакого желания. Я решил просто расклонировать SteamStream и вместо одного запускать шесть приложений. Это, несомненно, наикостыльнейший костыль, но выхода у меня не было. Поэтому я сделал
cd /usr/lib/red5/webapps/
cp SteamStream SteamStream2 и т.д.
Теперь (ура-ура!) в каждом приложении нужно внести небольшие изменения в код.
cd /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;
FPS — частота кадров видео с камеры. А TSINTERVAL равно 1000000/FPS.
Теперь, нужно чтобы каждое из запущенных SteamStream находились в своем скоупе. Поэтому в папках SteamStream2, SteamStream3 и т.д. надо в файле red5-web.properties поменять строку:
webapp.contextPath=/steamStream2 (3,4 и т.д)
А в web.xml поменять
<param-value>/steamStream2</param-value>
Теперь можно компилировать приложения. Все шесть штук по очереди:
cd /usr/lib/red5/webapps/steamStream/WEB-INF
ant compile
Далее нужно создать конфиги для всех шести камер и запустить шесть потоков VLC. Создаем файл /home/ipcam/cfg/stream1.cfg и пишем туда:
new stream1 broadcast enabled
setup stream1 input <url потока с камеры>
setup stream1 output "#rtp{dst=127.0.0.1,port=10000,sdp=file:///usr/lib/red5/webapps/steamStream/sdpdescriptors/stream1.sdp}"
control stream1 play
Важное замечание: в каждом из шести конфигов надо указать разные порты и папки для хранения sdp файла. То есть stream2.cfg выглядит следующим образом:
new stream2 broadcast enabled
setup stream2 input <url потока с камеры>
setup stream2 output "#rtp{dst=127.0.0.1,port=12000,sdp=file:///usr/lib/red5/webapps/steamStream2/sdpdescriptors/stream2.sdp}"
control stream2 play
Ну и далее по аналогии. Каждый процесс VLC запускается командой:
/home/ipcam/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/stream1.cfg --repeat --no-drop-late-frames --no-skip-frames --no-ffmpeg-hurry-up --no-sout-transcode-hurry-up --rt-priority
Красненьким - это чтобы не забыть, что нужно менять имя конфига для каждого процесса. Вот собственно и все. Чтобы поставить всю эту красоту на сайт, можно скачать JW Player и встроить в страницу код:
<div id="mediaplayer">JW Player goes here</div>
<script type="text/javascript" src="jwplayer.js"></script>
<script type="text/javascript">
jwplayer("mediaplayer").setup({
flashplayer: "player.swf",
width: '640',
height: '480',
file: "stream1.flv",
provider: "rtmp",
streamer: "rtmp://79.141.66.16/steamStream"
});
</script>
Вот такие пироги с котятами. Основные знания (или незнания) подчепрнуты мной отсюда, спасибо этому доброму человеку.
ну вроде пока всё верно
ОтветитьУдалить