Документация Flussonic Media Server

Содержание

Рассылка UDP с постоянным битрейтом (CBR)

Во Flussonic Media Server 20.07 кардинально переделана подсистема, рассылающая видео по мультикасту. Мы внесли два очень важных изменения:

В версии Flussonic 20.09 поддерживаются расширенные настройки MPTS:

Изменения в работе и настройке рассылки UDP мультикаста

Было

Во Flussonic уже была возможность отправить UDP multicast поток с константным битрейтом, но это касалось всего транспортного потока, а не конкретных дорожек (PIDs) в нём.

В предыдущих версиях Flussonic конфигурация рассылки мультикаста выглядела так:

stream tvchannel {
  url udp://239.0.0.1:1234;
  push udp://239.1.0.1:1234?cbr=4000&pcr=20;
}

Результирующий график битрейта можно посмотреть на картинках:

CBR MPTS

CBR MPTS

Как видно, суммарный график достаточно стабильный, но отдельные пиды сильно скачут.

Проблемы со старой системой (не считая расстроенных эстетических чувств) следующие:

  • Если из такого потока вырезать один аудиопид, скорее всего он перестанет быть CBR и совершенно точно в нём разломается точность проштамповки PCR.
  • В нём очень большой трафик нуль-пакетов, больше чем реально требуется.
  • При чтении такого потока часть клиентских устройств будет зависать, потому что он не выдерживает заполненность буфера приемника. На следующем графике видно, что буфер декодера, который управляется с помощью DTS и PCR, постоянно опустошается:

CBR MPTS

Стало

В версии Flussonic 20.07 рассылку мультикаста можно сконфигурировать так:

stream tvchannel {
  url udp://239.0.0.1:1234;
  push udp2://239.2.0.1:1234 bitrate=3200 vb=2720;
}

Важно! Необходимо предельно точно указать параметр vb (video bitrate). Это среднее за секунду значение битрейта видеопотока, которое получится отправить, включая все заголовки и инкапсуляцию в транспортный поток. Так, например, значение vb=2720 соответствует примерно битрейту 2600, заданному в настройках транскодера.

Пример эталонно сконфигурированного транскодера:

stream tvchannel {
  url udp://239.0.0.1:1234;
  transcoder vb=2600k bf=3 open_gop=true rc_method=cbr vui_video_params=0:0:5:5:5 fps=25 g=28 interlace=tff_separated level=3 refs=4 sar=16:11 size=1048x576:scale external=false hw=qsv ab=192k acodec=mp2a;
  push udp2://239.2.0.1:1234 bitrate=3200 vb=2720;
}

Замечание. Опции транскодирования interlace и rc_method описаны в справочнике по настройкам транскодера.

Такой поток выглядит следующим образом на графиках анализатора:

CBR MPTS

CBR MPTS

Самое главное, что график буфера выглядит уже эталонным:

CBR MPTS

Что же такое этот буфер? Речь идет о CPB, coded picture buffer, т.е. это буфер кадров. Он пополняется, когда они приходят из транспортного потока и удаляется, когда наступает PCR >= DTS. Т.е. у каждого кадра есть DTS и этот кадр будет лежать в буфере, пока не наступит время отдать его в декодер. Время наступает, когда приходит соответствующий PCR.

Также обратим внимание на хорошее качество перемешивания потока:

CBR MPTS

Чем равномернее перемешан поток, тем стабильнее будет PCR и общий битрейт при удалении одного из пидов из потока.

Это не все. Наше большое достижение — формирование выходного MPTS потока (мультипрограммного транспортного потока).

Формирование выходного MPTS

Для настройки отправки MPTS используется директива transponder:

stream channel1 {
  url udp://239.0.0.1:1234;
}
stream channel2 {
  url udp://239.0.0.2:1234;
}
transponder tp1 {
  bitrate 6400;
  ts_stream_id 2;
  provider Flussonic;
  push udp://239.1.0.1:1234 multicast_loop;
  push file://dumpts.ts;
  program 1010 {
    source channel1;
    title Channel1;
    pid 1010 pmt;
    pid 1011 v1 pcr;
    pid 1012 a1 bitrate=150;
    pid 1013 t1;
  }
  program 1020 {
    source channel2;
    title Channel2;
    pid 1010 pmt;
    pid 1021 v1 pcr;
    pid 1022 a1 bitrate=128;
    pid 1023 t1;
  }
}

Результат работы такого кода хорошо виден в анализаторе:

CBR MPTS

CBR MPTS

CBR MPTS

Этот поток можно смело подать на модулятор и отправить в кабельную сеть, эфир или спутник. В Flussonic есть готовый мультиплексор транспортного потока.

Впереди нас ждет упаковка EPG (EIT), HbbTV и прочих современных необходимых в MPEG-TS вещей.

Выбор выходных треков

Дорожки в настройках транспондера указываются так:

  program 1020 {
    source channel2;
    title Channel2;
    pid 1010 pmt;
    pid 1021 v1 pcr;
    pid 1022 a1;
    pid 1023 t1;
  }

Принимаемый поток может содержать много дорожек с субтитрами, аудио, видео и т.д. Вероятно, что не все они нужны в выходном MPTS потоке.

Вы можете указать, какую дорожку включить в выходной MPTS, назначив ей PID. Теперь только треки с назначенным PID будут уходить на транспондер или отправляться в UPD2, остальные - не будут.

Если треки не были указаны, все они будут отправлены в MPTS с автоматически назначенными PID. Но если была указана хотя бы одна дорожка, то другие дорожки не будут включены в вывод.

Это избавляет вас от необходимости создавать вспомогательный поток для приема только тех треков, которые вам нужны, а затем отправлять его в MPTS.

Настройки битрейта отдельных дорожек

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

  program 1020 {
    source channel2;
    title Channel2;
    pid 1010 pmt;
    pid 1021 v1 pcr;
    pid 1022 a1 bitrate=150;
  }

Такое указание битрейтов позволит вам настроить битрейт для лучшего использования полосы пропускания, меняя битрейты прямо во время трансляции MPTS.

Расширенные настройки MPTS (Flussonic 20.09)

Опции SI таблиц

Flussonic 20.09 позволяет сформировать более сложные NIT таблицы, содержащие LCN (logical channel number), T2 delivery system descriptor и другие опции. Некоторые из опций передаются также в SDT.

Flussonic реализует вариант настроек в соответствии со спецификацией NorDig Unified Requirements for Integrated Receiver Decoders version 3.1.1, выпущенной NorDig.

В настройки транспондера вы можете добавить следующие опции:

  • network 13582 original=8833 name="Example network"; — сеть доставки. Используется один и тот же original (original network) для NIT и SDT.

  • ts_descriptor 0x04 04012283; — тэг и HEX данные любого дескриптора. Это параметр, позволяющий вписать, например, любой ts_descriptor для NIT ts_loop. В примере указаны тег и HEX дескриптора "T2 delivery system descriptor". Добавляется в NIT и SDT.

  • ts_stream_id 2; — Добавляется в NIT и SDT.

  • service_type — используется как program P { service_type 0x16;} Если у программы указан source, но не указан service_type, то Flussonic пытается угадать service_type по пришедшему media_info.

  • timeout service_type 10; — если за 10 секунд источник не ожил, то вещаем без этой программы в NIT. По умолчанию timeout составляет 15 секунд.

  • program P { lcn 7 [visible=false];} — logical channel number.

Версии PSI таблиц

В PSI-таблицах есть поле version_number. При внесении изменения в таблицу текущее значение version_number в ней должно получить инкремент. Это даст сигнал принимающим устройствам (телевизорам) о том, что необходимо перечитать TS содержимое. Flussonic поддерживает указание номера версии в настройке транспондера. Таким образом, устройства смогут применить изменения в потоке или подготовиться к ним.

  • version psi VERSION_NUMBER — глобальная версия для всех PSI таблиц.

  • version sdt VERSION_NUMBER — версия конкретной SI таблицы, например, SDT.

TOT (time offset table)

Flussonic генерирует PSI таблицу TOT (time offset table). Настройки TOT имеет смысл указывать только в основном транспондере, а не в other.

Добавьте следующие опции в конфигурацию основного потока:

time_offset FRA:1 time_of_change=2018-03-23T03:00:00Z local_time_offset=+0100 next_time_offset=+0100;

Значения опций приводятся в спецификации

Пример

Полный пример конфигурации транспондера с расширенными настройками:

transponder ts-tp {
  push udp://239.1.2.4:1234 multicast_loop;
  push file://tmp/ts-tp.ts pkt_limit=300000;
  bitrate 27000;
  provider Flussonic;
  network 123123 original=12345 name="Example network 1";
  ts_stream_id 2;
  ts_descriptor 0x7f 040012340325; # T2_delivery_system_descriptor
  version psi 4;  # default
  version sdt 9;
  time_offset RUS:7 time_of_change=2018-03-23T03:00:00Z local_time_offset=+0600 next_time_offset=+0600;

  interval pcr 30;
  timeout service_type 10;

  program 1020 {
    source clock;
    title Channel1;
    lcn 2;
    pid 1120 pmt;
    pid 1121 v1 pcr bitrate=500;
    pid 1122 a1 bitrate=150;
  }
  program 1030 {
    title Channel2;
    lcn 3 visible=false;
    service_type digital_tv_mpeg2_hd;
  }
  program 1040 {
    title Channel4;
    lcn 4;
  }

  other @02;
}

transponder 02 {
  bitrate 0;
  network 123123 original=12345 name="Another network";
  ts_stream_id 1;
  ts_descriptor 0x7f 040033123325;
  program 1010 {
    lcn 1;
    service_type digital_tv_mpeg2_hd;
  }
  program 1070 {
    lcn 7;
    service_type 0x20;
  }
}

Добавление в транспондер ссылок на другие транспондеры

Для услуги TV необходимо, чтобы были известны все каналы, включенные в услугу, для отображения их на клиентских устройствах. Для этого каждый передаваемый транспондер (MPTS поток), а он содержит только часть каналов, должен располагать информацией обо всех остальных передаваемых со спутника каналах на других частотах.

Например, на одной частоте (MPTS потоке, или в транспондере) передается 10 каналов, а всего 40 частот, следовательно, есть 400 каналов, и о них необходимо передать информацию в каждом MPTS потоке. Для этого в настройки каждого потока следует добавить ссылки на другие потоки, составляющие вашу услугу.

Чтобы добавить одну такую ссылку, в опции other укажите имя другого MPTS потока.

transponder ts-tp {
  push udp://239.1.2.4:1234 multicast_loop;
  push file://tmp/ts-tp.ts pkt_limit=300000;
  bitrate 27000;
  provider Flussonic;
  network 13582 original=8833 name="Example network 1";

  program 1020 {
    source clock;
    title Channel1;
    lcn 2;
    pid 1120 pmt;
    pid 1121 v1 pcr bitrate=500;
    pid 1122 a1 bitrate=150;
  }


  other @02;
}

transponder 02 {
  bitrate 0;
  network 13582 original=8839 name="Another network";
  ts_stream_id 1;
  ts_descriptor 0x7f 040022830325;
  program 1010 {
    lcn 1;
    service_type digital_tv_mpeg2_hd;
  }

}

Транспондер, указанный в other, отправляется в NIT и SDT.