четверг, 9 мая 2013 г.



Организация видеотрансляции с помощью пакета ffmpeg на CentOS 6.4. 

Условия выполнения работ – имеется IP веб-камера BEWARD, подключенный к ней микрофон и ПК (виртуальная машина). На ПК CentOS 6.4. Необходимо организовать видеотрансляцию со звуком с IP web-камеры, что бы пользователи сети Интернет могли просматривать трансляцию через браузер. Обобщенная схема трансляции:


1 Устанавливаем ffmpeg по официальной инструкции с сайта http://ffmpeg.org/trac/ffmpeg/wiki/CentosCompilationGuide

1.1 Удаляем старые пакеты (вдруг они есть) из системы: 

# yum erase ffmpeg x264 x264-devel 

1.2 Устанавливаем пакеты, необходимые для сборки ffmpeg 

# yum install autoconf automake gcc gcc-c++ git libtool make nasm pkgconfig wget zlib-devel 

1.3 Создаем директорию, в которую будим качать исходники и переходим в нее:
# mkdir ~/ffmpeg-source
# cd ~/ffmpeg-source/ 


1.4 Устанавливаем Yasm. Этот пакет представляет собой ассемблер, который потребуется для дальнейшей сборки пакета ffmpeg.
# wget http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz
# tar xzvf yasm-1.2.0.tar.gz
# cd yasm-1.2.0
# ./configure
# make
# make install

1.4 Устанавливаем библиотеку x264, которая является видедекодером стандарта H.264.
# cd ~/ffmpeg-source
# git clone git://git.videolan.org/x264
# cd x264
# ./configure --enable-static
# make
# make install

Примечание: Если в системе не удалось выполнить команду «git», значит в ней не стоит пакет Git. Поставить его можно так:
# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
# wget https://git-core.googlecode.com/files/git-1.8.2.1.tar.gz
# tar -zxf git-1.8.2.1.tar.gz
# cd git-1.8.2.1
# make prefix=/usr/local all
# make prefix=/usr/local install

1.5 Устанавливаем пакет AAC, который является аудиодекодером
# cd ~/ffmpeg-source
# git clone --depth 1 git://github.com/mstorsjo/fdk-aac.git
# cd fdk-aac
# autoreconf -fiv
# ./configure --disable-shared
# make
# make install

1.6 Устанавливаем пакет LAME, который предназначен для работы с аудио формата MP3
# cd ~/ffmpeg-source
# wget http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz
# tar xzvf lame-3.99.5.tar.gz
# cd lame-3.99.5
# ./configure --disable-shared --enable-nasm
# make
# make install

1.7 Устанавливаем библиотеку libogg, которая предоставляет функции, необходимые программам для чтения или записи битовых потоков в формате Ogg
# cd ~/ffmpeg-source
# wget http://downloads.xiph.org/releases/ogg/libogg-1.3.0.tar.gz
# tar xzvf libogg-1.3.0.tar.gz
# cd libogg-1.3.0
# ./configure --disable-shared
# make
# make install

1.8 Устанавливаем библиотеку libtheora, которая предоставляют функции для чтения и записи видеофайлов
# cd ~/ffmpeg-source
# wget http://downloads.xiph.org/releases/theora/libtheora-1.1.1.tar.gz
# tar xzvf libtheora-1.1.1.tar.gz
# cd libtheora-1.1.1
# ./configure --disable-shared
# make
# make install

1.9 Устанавливаем библиотеку libvorbis, которая предоставляют функции, используемые при чтении и записи звуковых файлов.
# cd ~/ffmpeg-source
# wget http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.3.tar.gz
# tar xzvf libvorbis-1.3.3.tar.gz
# cd libvorbis-1.3.3
# ./configure --disable-shared
# make
# make install

1.10 Устанавливаем библиотеку libvpx, которая умеет работать с форматом видео Vp8, используемом в HTML5.
# cd ~/ffmpeg-source
# git clone http://git.chromium.org/webm/libvpx.git
# cd libvpx
# ./configure
# make
# make install

1.11 Наконец устанавливаем пакет ffmpeg, в который включаем поддержку, ранее установленных пакетов
# cd ~/ffmpeg-source
# git clone git://source.ffmpeg.org/ffmpeg
# cd ffmpeg
# ./configure --enable-gpl --enable-libfdk_aac --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-nonfree
# make
# make install

2. Устанавливаем Apache и разрешаем подключение к нему извне по 80-ому порту.
# yum install httpd
# chkconfig --levels 235 httpd on
# /etc/init.d/httpd start
# iptables -I INPUT -p tcp --dport 80 -j ACCEPT
# iptables-save
Обратившись через браузер к серверу, мы получим тестовую страницу Apache.

3. Создаем конфигурационный файл сервера вещания ffserver и разрешаем подключение к нему по порту 8090.

3.1 Создание конфигурационного файла.
# touch /etc/ffserver.conf
# nano /etc/ffserver.conf
и вносим в него конфигурацию. Например:

#Порт на котором будет идти вещание
Port 8090
BindAddress 0.0.0.0
MaxHTTPConnections 100
MaxClients 100
MaxBandwidth 10000
# Указываем фвйл логов. Для отладки можно поставить
# CustomLog –
# Тогда логи буду валиться в консоль
CustomLog /var/log/ffserver/ffserver.log
#После отладки можно закомментировать эту строку
NoDaemon

#Определяем источник
<Feed feed1.ffm>
File /tmp/feed1.ffm
FileMaxSize 500M
</Feed>

#Определяем поток
<Stream video.swf>
Feed feed1.ffm
Format swf
VideoCodec flv
VideoFrameRate 15
VideoBufferSize 50000
VideoBitRate 1000
VideoSize 640x384
</Stream>

#Определяем страницу статистики
<Stream stat.html>
Format status
</Stream>

Для наглядности основные сущности конфигурационного файла представлены на рисунке:

Пока приведенная выше конфигурация определяет лишь то, что сервер вещания ffserver будет иметь лишь один источник feed1 и один выходной поток flash – video.swf . 
Конкретно откуда брать сигнал и куда вещать будет задаваться отдельными командами.

3.2 Разрешаем в iptables обращение к порту 8090.
Открываем файл iptables 
#nano /etc/sysconfig/iptables 
Вписываем строки: 
-A INPUT -p tcp --dport 8090 -j ACCEPT 
-A INPUT -p udp --dport 8090 -j ACCEPT 
У меня получилось: 
# Generated by iptables-save v1.4.7 on Thu May 9 17:19:41 2013 
*filter 
:INPUT ACCEPT [0:0] 
:FORWARD ACCEPT [0:0] 
:OUTPUT ACCEPT [46549019:40517613520] 
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT 
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -p icmp -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 8090 -j ACCEPT 
-A INPUT -p udp -m udp --dport 8090 -j ACCEPT 
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT 
-A INPUT -j REJECT --reject-with icmp-host-prohibited 
-A FORWARD -j REJECT --reject-with icmp-host-prohibited 
COMMIT 
# Completed on Thu May 9 17:19:41 2013 

4. Запускаем сервер:
# ffserver -f /etc/ffserver.conf
Эту команду лучше запустить в отдельной консоли, так как остановить ее (нажатием Ctrl-C) – значит остановить сервер.
Убедимся, что сервер работает, посетив страницу его статистики по адресу:
http://<IP адрес сервера>:8090/stat.html
Пример:

5. Для того что бы сервер начал работать необходимо определить серверу источник и путь вещания выходных потоков.

Примеры:

Для вещания из файла (файл gagarina.mp4 – видеоклип с разрешением 360х640):
# ffmpeg -i /root/gagarina.mp4 -s 360x640 -r 24 -ac 1 -ar 8000 -b 30 -ab 12 http://46.20.64.50:8090/feed1.ffm 

Для переприема музыкального канала из Интернета:
# ffmpeg -i http://wtv.cores.biz/relay/zonam.mp4 http://46.20.64.50:8090/feed1.ffm 
После запуска команды консоль становиться недоступной. 

И наконец для вещания с IP камеры, имеющей адрес 188.168.3.201
# ffmpeg -i rtsp://188.168.3.201:554/h264 http://46.20.64.50:8090/feed1.ffm 
После запуска команды консоль становиться недоступной. 

В браузерах Mozilla, Chrome, Opera можно увидеть вещание по адресу flash потока http://<IP адрес сервера>:8090/video.swf В Internet Explorer трансляция в таком виде почему-то не отображается.

6. Для просмотра трансляции через любой современный браузер по стандартному порту необходимо создать html страничку и вставить туда следующий ключевой тег:
<embed src="http://<IP адрес сервера>:8090/video.swf" width=640 height=400 />

К сожалению, скормить эту ссылку какому-то флеш-плееру у меня не получилось, поэтому на странице в моем варианте присутствовал прямоугольник, в котором велось вещание. Ни растянуть экран, ни прибавить / убавить громкость в таком варианте нельзя. Но, однако, изображение есть и звук тоже! :)

ПРИМЕЧАНИЯ:
1.    Просмотр доступных кодеков производиться командой:
  # ffmpeg -codecs
2.    Если в конфиге сервера ffmpeg закомментировать строку NoDemon, то запустить сервер ffserver можно так
  # ffserver -n -f /etc/ffserver.conf
и он не заблокирует консоль.
Так же запустить сервер без блокирования консоли можно так:
  # nohup ffserver -n -f /etc/ffserver.conf > /dev/null 2>&1 &

Источники добавлять можно так, что бы консоль не блокировалась:
# nohup ffmpeg -loglevel 0 -v 0 -i rtsp://10.200.72.112:554/user=admin\&password=\&channel=1\&stream=0.sdp? http://10.200.16.230:8090/feed1.ffm > /dev/null 2>&1 &
# nohup ffmpeg -loglevel 0 -v 0 -i rtsp://10.200.72.113:554/user=admin\&password=\&channel=1\&stream=0.sdp? http://10.200.16.230:8090/feed2.ffm > /dev/null 2>&1 &
Здесь перед спесимволами важно ставить обратный слеш

Убиваем процессы командами:
# ps ax | grep ff
Определяем PID и убиваем его
# kill -9 <PID

2 комментария:

  1. Спасибо. У меня тоже есть пару статей по FFMPEG: http://plutov.by/post/html5_ffmpeg

    ОтветитьУдалить
  2. Подскажите пожалуйста, где можно посмотреть логи конвертации?

    ОтветитьУдалить