суббота, 3 февраля 2018 г.

IP stream for BeeLine. Создаём IP поток для Билайн

Предположим ситуацию:
Вы работаете на телевидении (кабельном) техническим сотрудником. Ваш исходящий вещательный тракт построен на IP мультикастной группе. Сигнал отправляется к разным провайдерам. Например: МТС, ТТК, в которых требования сигнала значатся параметры  MPEG-4 с надстройками видео AVC/H264, звука MPEG1L2 и определённой скоростью потока. В принципе всё просто.

А теперь в целях расширения вещания вам нужно отправить IP поток для ретрансляции по кабельным в Билайн со следующими параметрами:

Основной поток видео:
Profile and level H.264/AVC Main or High @ L3
Bit rate Video - 2,5 Mbps CBR
Resolution X: 720 Y: 576
Frame rate - 25i
RAP interval - Two seconds (fixed)
GoP Fixed IBBBPBBBP, длина GOP 24 фрейма

Параметры аудио: MpegL2, Bit rates - 192 Kbps CBR, Sample frequency 48 kHz, Operating modes Stereo, Language RUS.

Требования к потоку PiP:
Параметры видео:
Profile and level H.264/AVC Main @ L1.3
Bit rate Video - 0,245 Mbps CBR
Resolution X: 192 Y: 192
Aspect ratio 4x3
Frame rate - 25i
RAP interval - Two seconds (fixed)

Оба потока в формате MPEG 7TS/UDP.
Всё понятно?

Теперь обратим внимание на то, что ваши кодеры на сервере вещания не позволяют настроить поток таким образом. Да, есть решение для ПО Форвард, и оно естественно стоит немалых денег. А если не Форвард?
Что делать...
Приобретение кодирующих железок в данной ситуации не рассматривается.
Придётся пробовать городить собственный кодер на основе бесплатных платформ.
Нужно транскодировать сигнал основной программы в тот, который нужен Билайну.

Первым приходит в голову VLC с запусками параметров из командной строки. И проще сломать себе руки и выколоть глаза, чем настроить VLC с нужными параметрами и сделать так, чтобы при обрыве входящего потока он не CRASH-ился каждый раз.

После множества неудачных опытов с VLC, была выбрана другая очень стабильная платформа - FFMPEG!

Настраивается очень гибко, и за 4 месяца работы не было ни одного падения сервиса! Это очень важный пунктик для бесперебойного вещания!

После долгих экспериментов и исследований получился следующий код для запуска основного потока:

ffmpeg  -localaddr 192.168.1.113 -i udp://@239.0.23.23:4444  -c:v libx264 -profile:v main -level 3.0 -preset fast -tune zerolatency  -g 24 -bf 3 -b_strategy 0 -flags -cgop  -r 25 -x264-params "nal-hrd=cbr" -b:v 2500k -minrate 2500k -maxrate 2500k -muxrate 3000k -bufsize 1M -s 720x576 -vf setdar=4/3 -flush_packets 0 -threads 4  -trellis 2 -cmp 2 -subcmp 2    -acodec mp2 -ac 2 -ab 192k -ar 48000   -async 1  -metadata:s:a:0 language=rus    -f mpegts udp://239.192.40.50:5151?pkt_size=1316

где:
-localaddr 192.168.1.113 - IP сетевой карты в компьютере которая подключена к коммутатору с вашим вещательным потоком. Указывается интерфейс для приёма и основной работы с вашим мультикастом (при наличии 2-х и более сетевых карт в компьютере);
 -i udp://@239.0.23.23:4444 - Мультикаст вашего основного потока;
 -c:v libx264 -profile:v main -level 3.0 - основные требования потока;
-preset fast -tune zerolatency - параметры обработки входящего сигнала. Если компьютеру будет тяжело транскодировать сигнал, можно fast заменить на veryfast или ultrafast, но от этого значительно ухудшится качество изображения;
-g 24 - Размер группы картинок;
-bf 3 - Количество B кадров между I и P кадрами;
-b_strategy 0 - допуск B кадров. Если поставить значение 1, то количество B кадров не всегда будет равно 3м. Образуется неровность структуры кадров;
-flags -cgop - флаг убирает закрытую структуру GoP - структура становится открытой;
 -flush_packets 0 - отменить сливание пустых пакетов при мультиплексировании. Если убрать этот параметр пакеты TS будут отправляться "полупустыми". С этим параметром пакеты наполняются "стаффом" (FFFFFFFFFFFF) и имеют стабильный размер;
-f mpegts udp://239.192.40.50:5151?pkt_size=1316 - выходной адрес траскодированного сигнала с ограничением пакета 1316 байт (для создания пакетной структуры 7 TS пакетов на одну посылку UDP).

Получается нужная структура:


Для потока PIP:


ffmpeg -fflags +genpts  -fflags +igndts -localaddr 192.168.1.113 -i udp://@239.0.23.23:4444 -c:v libx264 -profile:v main -level 1.3 -g 15  -r 25  -keyint_min 15 -bf 2 -b_strategy 0 -flags -cgop -x264-params "nal-hrd=cbr"  -b:v 245K -minrate 245K -maxrate 245K  -muxrate 400K -bufsize 500K  -s 192x192 -vf setdar=4/3 -aspect 4:3  -preset ultrafast -tune zerolatency  -flush_packets 0 -threads 4  -trellis 2 -cmp 2 -subcmp 2  -an     -f mpegts udp://239.192.40.51:5050?pkt_size=1316

Всё работает отлично!
По загрузке процессора можно сказать, что при работе на процессоре i7 загрузка системы на один транскодер составляет всего 4-6%. При обрыве входящего сигнала ничего не отваливается, а при появлении - FFMPEG продолжает работу в штатном режиме.



convert colors to midi note for midi controllers

I recently (2 years ago) designed and built a simple MIDI controller for my intercom system using an Arduino Leonardo, USB hub, sound card, ...