18 December 2014

Open Broadcast Encoder

Open source
Сегодня хочу рассказать о замечательном продукте английской компании Open Broadcast Systems Ltd. Это софтверный энкодер видео-аудио потока.

Я познакомился с этим продуктом на выставке IBC-2013. Там же на конференциях выяснил ряд интересных подробностей о том, откуда «ноги растут». А растут они из EBU и BBC, двух гигантов научно-исследовательской деятельности в сфере теле-радио вещания.

Так чем же является OBE, а чем не является?

OBE это энкодер получающий на вход SDI сигнал и выдающий на выход IP поток.
Сфера его возможного применения достаточно широка, но основное его предназначение это профессиональное телевидение. Его нельзя использовать для интернет вещания, по крайней мере напрямую.
В прошлой статье я опустил технические подробности своего проекта, теперь начну заполнять данный пробел.
Приступим к сборке и установке. На сайте OBE есть замечательная инструкция, но в ней есть и ряд недочётов и пробелов. Сразу оговорюсь, что сборка будет производиться под Centos 6.5. Учитывайте это и проверяйте значение путей при сборке.

Первым делом обновляем Yasm до версии 1.2.0 или выше.
Это можно сделать стандартными средствами вашего дистрибутива Linux. Если данного пакета нет, то собираем из исходников:

wget http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz
tar -zxvf yasm-1.2.0.tar.gz
cd yasm-1.2.0/ && ./configure --prefix=/usr --libdir=/usr/lib64 && make && make install

Устанавливаем ряд зависимостей:
yum install -y libtwolame.x86_64 libtwolame-devel.x86_64 autoconf.noarch git.x86_64 libtool.x86_64 zvbi-devel.x86_64 screen.x86_64

Теперь сам энкодер.
mkdir ./obe && cd ./obe
git clone https://github.com/ob-encoder/fdk-aac.git
cd ./fdk-aac
autoreconf -i && ./configure --prefix=/usr --libdir=/usr/lib64 --enable-shared
make && make install

git clone https://github.com/ob-encoder/libav-obe.git
cd ../libav-obe
./configure --prefix=/usr --libdir=/usr/lib64 --enable-gpl --enable-nonfree --enable-libfdk-aac --disable-swscale-alpha --disable-avdevice --enable-shared --enable-pic
make && make install

git clone https://github.com/ob-encoder/x264-obe.git
cd ../x264-obe && ./configure --prefix=/usr --libdir=/usr/lib64 --disable-lavf --disable-swscale --disable-opencl --enable-shared --enable-pic
make && make install

git clone https://github.com/ob-encoder/libmpegts-obe.git
cd ../libmpegts && ./configure --prefix=/usr --libdir=/usr/lib64
make && make install

Теперь устанавливаем драйвер SDI платы от Blackmagic.
Идем на сайт и качаем версию 9.8. Её там в прямом доступе уже нет. Новый драйвер я не проверял. Можете скачать новый и проверить. Если через примерно 25 часов звук не отвалился, то всё хорошо.

Обновляем прошивку:
BlackmagicFirmwareUpdater status
BlackmagicFirmwareUpdater update №карты

Не отменяйте процесс! «Кирпич» обеспечен. У меня ушло две недели на «танцы с бубном» для восстановления данной железки.

Обновляем, перегружаемся.

Идём дальше:
git clone https://github.com/ob-encoder/obe-rt.git
cd ./obe-rt
export PKG_CONFIG_PATH=/usr/lib64/pkgconfig
./configure --prefix=/usr --libdir=/usr/lib64
make && make install

Если всё прошло гладко, то продолжаем.

Подключаем источник SDI сигнала ко входу платы Decklink.
Без этого ничего не выйдет. Энкодер не имеет задающего генератора и использует синхросигнал SDI. Если есть возможность, то настоятельно рекомендую купить генератор и подключить его ко всем SDI устройствам. Поверьте, это избавляет от огромной кучи проблем.

Вернёмся к энкодеру. Первым делом вам нужно освоить screen. Это «оконный» менеджер терминала. Он вам очень пригодиться и не только здесь.

Запускаем менеджера:
screen -RD encoder

Запускаем энкодер:
obecli

Теперь внимание!
На сайте OBE даны примеры конфигурации — не используйте их как есть!
Он дан исключительно для ознакомления, для реальной трансляции это использовать нельзя!

Прочитайте значение всех опций для саморазвития.

Теперь полностью рабочая конфигурация, которая даёт на анализаторах потока правильную картинку:
set input decklink
set input opts card-idx=0 // если карт или входов несколько, поменяйте значение
set input opts video-format=1080i50 // да да именно 50i, это телевидение, но об этом в следующей статье.
probe input

Если всё правильно, то вы получите следующее сообщение:
Probing device: Decklink card 0. Timeout 20 seconds
..
Detected input streams:
Input-stream-id: 0 - Video: RAW 1920x1080i 25/1fps
Input-stream-id: 1 - Audio: PCM 16 channels 48kHz

Encoder outputs:
Output-stream-id: 0 - Input-stream-id: 0 - Video: AVC
Output-stream-id: 1 - Input-stream-id: 1 - Audio: RAW - SDI audio pair: 1

Теперь настройка самого потока.
Опять внимание! При использовании данного конфига, вы гарантированно получаете «правильный» поток. Это было проверенно на нескольких аппаратных и программных анализаторах, а так же на конечных устройствах пользователей. Любые изменения приведут к ошибкам в потоке!
set stream opts 0:threads=8,format=avc,level=41
set stream opts 1:format=mp2,mp2-mode=stereo
set muxer opts ts-muxrate=5000550,ts-type=dvb,pcr-period=40,cbr=1
set stream opts 0:pid=101
set stream opts 1:pid=110
set muxer opts ts-id=1,program-num=1,pmt-pid=100
set stream opts 0:lookahead=0,bframes=0
set stream opts 0:profile=high,max-refs=3
set stream opts 0:keyint=12,vbv-maxrate=4500,vbv-bufsize=4500,bitrate=4500
set stream opts 1:bitrate=256
set outputs 1
set output opts 0:target=udp://224.0.0.1:5000?ttl=100&miface=eth0
start

Ответ энкодера:
Encoding started

Теперь энкодер начал кодирование потока 5 mbps на мультикастовый адрес 224.0.0.1 и порт 5000.

Если вы решили изменить скорость потока, но до этого ничего подобного не делали, просто пойдите налейте чаю и расслабьтесь.
Для тех у кого есть опыт и много-много желания, могу посоветовать программный анализатор потока mpeg-analyzer от streamguru.de. Он не бесплатный, но есть полнофункциональный триал. Должно хватить.
На данном снимке анализатора показан правильный поток:



А здесь то, за что могут дать по голове:



Теперь несколько слов о том, чего делать нельзя, без полного понимания «зачем».
В энкодере предусмотрен режим lowestlatency, позволяющий снизить задержку кодирования до нескольких долей секунды. Данная опция требует наличия режима intra-refresh. По этому поводу можно почитать в интернете. Касательно данного продукта, пока лучше забыть об этой опции, она «сырая» и мало управляемая. К тому же структура intra-refresh поддерживается далеко не всеми устройствами воспроизведения, а ваш провайдер, обеспечивающий услугу CDN к примеру, может увидеть на записи прекрасный чёрный прямоугольник на весь экран.

Вот собственно и всё.

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

В следующий раз планирую ликбез для любителей «поснимать» видео на DSLR.
Ликбез с точки зрения BBC, EBU и моего скромного опыта.
Tags:телевидение высокой четкостиiptv
Hubs: Open source
+10
5.1k 79
Comments 5
Popular right now