Предположим ситуацию:
Вы работаете на телевидении (кабельном) техническим сотрудником. Ваш исходящий вещательный тракт построен на 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 продолжает работу в штатном режиме.
Основной поток видео:
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)
Всё понятно?
Теперь обратим внимание на то, что ваши кодеры на сервере вещания не позволяют настроить поток таким образом. Да, есть решение для ПО Форвард, и оно естественно стоит немалых денег. А если не Форвард?
Что делать...
Приобретение кодирующих железок в данной ситуации не рассматривается.
Придётся пробовать городить собственный кодер на основе бесплатных платформ.
Нужно транскодировать сигнал основной программы в тот, который нужен Билайну.
Первым приходит в голову 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 продолжает работу в штатном режиме.