Использование меток SCTE-104/35 в системах цифровой вставки программ. Часть 2. Управление вставкой программ с использованием сообщений SCTE-104/35
В первой части статьи речь шла об архитектуре систем сетевого вещания с цифровой вставкой программ. Ниже рассматриваются вопросы управления вставкой программ с использованием сообщений SCTE-104/35.
Виды команд в сообщениях SCTE-35
Сообщение SCTE-35 может содержать одну из шести возможных команд. Две команды – Splice_schedule()
и Splice_insert()
– предназначены для передачи информации об одном или нескольких предстоящих событиях сплайсинга. Наличие скобок в обозначении команды говорит о том, что в ее составе передается набор данных, определяемых в спецификациях SCTE для каждой команды.
Определены четыре вида вспомогательных команд: Splice_null()
, Bandwidth reservation()
, Time_signal()
, Private_command()
.
Команда Splice_null()
не передает каких-либо данных и используется для проверки отклика от устройств-получателей сообщений. Команда Bandwidth reservation()
используется для отправки системе компрессии запроса на выделение дополнительной полосы пропускания, которая будет использоваться для передачи элементарного PID-потока с сообщениями SCTE-35. Команда Time_signal()
используется для передачи меток точного времени, на основании которых устройства-получатели команды могут синхронизировать выполнение своих действий с устройствами-отправителями команд. А команда Private_command()
может использоваться для передачи других данных, не оговоренных в спецификациях SCTE-104/35.
Виды команд в сообщениях SCTE-104
Сообщение SCTE-104 принципиально может содержать до 216 различных команд, однако из этого множества реально используются только несколько десятков. Конкретный список используемых команд различается для двух типов сообщений – тех, что могут содержать только одну команду (Single Operation Message), и тех, которые могут содержать одну и более команд (Multiple Operation Message). На практике в основном используются сообщения второго типа.
Сообщения SCTE-104 типа Multiple Operation Message
На рис. 2-1 показаны поля сообщений SCTE-104 типа Multiple Operation Message.
Сообщение состоит из двух частей. Первая часть – набор полей заголовка Multiple Operation Message
, этот заголовок содержит общие для всех команд поля. Вторая часть – набор полей передаваемой в сообщении команды. Здесь для примера даны поля двух команд – Schedule_definition_request
и Splice_request
.
В составе заголовка Multiple Operation Message
находятся поля:
Reserved
– всегда устанавливается в значениеFFFFh
;Message Size
– содержит размер всего сообщения в байтах;Protocol Version
– для актуальных реализаций устанавливается в 0. В будущих реализациях с иной укладкой в сообщение полезной нагрузки будут использоваться иные значения;AS_index
– идентифицирует для инжектора систему автоматизации, которая является источником сообщения SCTE-104. В то же время основная и резервная системы автоматизации, работающие на один программный канал (один инжектор), должны иметь общий индекс, но в каждый момент времени на связи должна находиться (быть активной) только одна из них. Нулевое значение игнорируется;Message_number
– идентифицирует каждое отдельное сообщение SCTE-104. В то же время, если несколько повторяющихся сообщений имеют общее содержание, они должны иметь один и тот же номер. Для последовательных различающихся сообщений используется инкрементируемое по модулю 256 значениеMessage_number
;DPI_PID_index
– несет информацию об идентификаторе PID-пакетов MPEG-2 TS, в которых система автоматизации планирует передавать элементарный поток сообщений SCTE-35. Этот индекс используется, если в составе одной программы передаются несколько потоков сообщений SCTE-35, каждый из которых формируется своим выделенным инжектором. Другой вариант использования – адресация сообщений от системы автоматизации одному из нескольких инжекторов, использующих общую линию SDI для связи с системой автоматизации через один инсертер. Нулевое значение игнорируется;SCTE-35 Protocol Version
– предназначены для использования в будущих реализациях, когда актуальная нулевая версия получит дальнейшее развитие;Timestamp()
– содержит значение времени, когда инжектором должны обрабатываться поступающие в данном сообщении команды. Это режим отложенной (deferred) обработки команд в инжекторе. В таком режиме время в системе автоматизации и в инжекторе должно быть общим с точностью до нескольких миллисекунд. Если в сообщении SCTE-104 содержится несколько команд, то они должны обрабатываться инжектором в указанное время, начиная с первой команды и далее в порядке расположения команд в теле сообщения. ПолеTimestamp()
имеет различную длительность в зависимости от варианта передачи данных. Возможны три варианта форматирования времени в этом поле: время UTC с точностью до микросекунд (отсчитывается от 0 часов 6 января 1980 г), временной код VITC HH:MM:SS:FF, номер и активный фронт триггера GPI, который инициировал передачу сообщения. В режиме немедленного выполнения (immediate mode) полеTimestamp()
устанавливается равным 0, команда обрабатывается инжектором без задержки, синхронизация времени между системой автоматизации и инжектором не требуется. Такой вариант рекомендуется использовать при формировании сообщений SCTE-104 в составе сигнала SDI, тогда данные SCTE-104 помещаются инсертером в пакеты VANC ближайшего кадра. Размер поляTimestamp()
в этом случае равен 1 байту;Num_ops
– определяет количество команд, которое передается в данном сообщении SCTE-104 в виде блоков. В каждый блок данных входят поляOp_ID
,Data_length
,Data()
передаваемой в этом блоке команды. Для передачи одной команды используется значениеNum_ops=1
. Важно отметить, что каждая из команд в одном сообщении SCTE-104 преобразуется инжектором в отдельное сообщение SCTE-35, всегда содержащее только одну команду;Op_ID
– идентифицирует команду, которая передается в блоке данных. Связь идентификатора и команды определена в [SCTE 104]. В данном примере значениеOp_ID=0101
указывает на передачу данных командыsplice_request_data()
,Op_ID=010Е
указывает на передачу данных командыschedule_definition_data()
;Data_length
– указывает на общее количество байтов в команде;Data()
– содержит данные (параметры) команды, определенной ранее в полеOp_ID
.
Команды управления сплайсингом
Среди множества возможных команд в сообщениях SCTE-104/35 выделяются две пары взаимосвязанных команд SCTE-104 и SCTE-35, проходящих по всей цепи система автоматизации → система компрессии → сплайсер. Обе пары команд передаются в широковещательном (broadcast) режиме для всех ЦРП в составе сети распространения программного сигнала ЦФП. Спецификация [SCTE 35] описывает варианты шифрования сообщений SCTE-35, которые могут декодироваться на приемной стороне при наличии ключа. Однако по данным [SCTE 67] шифрование этих сообщений на практике не используется.
Команда SCTE-104 Schedule_definition_request()
преобразуется инжектором в команду SCTE-35 Splice_schedule()
, обе переносят уведомляющую информацию о расписании предстоящего события сплайсинга. Команда SCTE-104 Schedule_definition_request()
обычно следует за командой start_schedule_download request()
, которая подготавливает инжектор к приему относительно большой (до 4096 байт) порции данных, содержащихся в последующих сообщениях Schedule_definition_request()
.
Команда SCTE-104 Splice_request()
преобразуется инжектором в команду SCTE-35 Splice_insert()
. Последовательная передача этих команд обеспечивает управление сплайсером от системы автоматизации при переключении между основным каналом и каналом ввода.
Практика работы систем DPI, приведенная в [SCTE 67], указывает на преобладающее использование пары команд Splice_request()
и Splice_insert()
для управления сплайсингом. По этой причине ниже более подробно анализируется состав полей данных именно этих команд. Поля, выделенные одинаковым цветом в таблицах данных Schedule_definition_request()
и Splice_request()
, обладают идентичным содержанием. Специфическими для команды Schedule_definition_request()
являются поля Spice_schedule_command
и Time()
. Первое поле определяет вид точки сплайсинга – вход или выход, значение Spice_schedule_command=5
означает отмену ранее переданных данных. Поле Time()
содержит время в формате UTC, на которое планируется событие сплайсинга.
Поля данных команды Splice_request()
Splice_insert_type
определяет тип запроса на выполнение сплайсинга. ЗапросыSpliceStart_normal
(Splice_insert_type=1
) иSpliceEnd_normal
(Splice_insert_type=3
) определяют команды «нормального» старта и окончания рекламного брейка, когда соответствующее событие сплайсинга должно произойти через интервал времениpre-roll_time
. Значениеpre-roll_time
передается в соответствующем поле этой же команды. ЗапросыSpliceStart_immediate
(Splice_insert_type=2
) иSpliceEnd_immediate
(Splice_insert_type=4
) определяют команды «немедленного» старта и окончания рекламного брейка. В таком режиме значение поляpre-roll_time
игнорируется или передается равным 0. Запросы «немедленного» действия не рекомендуются к использованию, поскольку могут приводить к нарушению условий бесшовного сплайсинга. ЗначениеSplice_insert_type=5
означает запрос на отмену предыдущего запросаSpliceStart_normal
.Splice_event_id
содержит уникальный идентификатор события сплайсинга. Допускается использовать один и тот же идентификатор для точки входа и точки выхода брейка. 32-разрядное поле позволяет использовать этот идентификатор для передачи дополнительной информации о рекламном брейке.Unique_program_id
служит для идентификации региональным вещателем программы центральной станции, во время которой должно произойти событие сплайсинга. Нулевое значение игнорируется.Pre-roll_time
указывает в миллисекундах интервал времени от выдачи сообщенияsplice_request
до выполнения события сплайсинга. Минимальное рекомендуемое значение для «нормальных» команд сплайсинга составляет 4 с. Можно использовать и другие значенияpre-roll_time
, в том числе различные значения для событийSpliceStart_normal
иSpliceEnd_normal
, относящихся к одному рекламному брейку. Для «немедленных» команд сплайсинга значениеpre-roll_time
либо равно 0, либо игнорируется. Если для одного события сплайсинга с единымSplice_event_id
последовательно формируются несколько сообщений, то в каждом из следующих за первым сообщением должно содержаться свое уменьшенное значениеpre-roll_time
. Если между несколькими командами на один переход возникает рассогласование значенийpre-roll_time
, то учитывается значениеpre-roll_time
из последнего принятого сообщения.Break_duration
указывает в десятых долях секунды длительность рекламного брейка, выполнение которого инициируется данной командой. Обычная практика заключается в отправке пары сообщений: первое – на старт, второе – на окончание рекламного брейка при нулевых значенияхBreak_duration
иAuto_return_flag
. Передача в составе сообщения истинного значенияBreak_duration
вместе с ненулевым значениемAuto_return_flag
указывает на автоматический возврат к программе центральной станции по истечении времени рекламного брейка без отправки командыSpliceEnd_normal
. Рекомендуется передавать в составе сообщения истинное значениеBreak_duration
и при нулевомAuto_return_flag
для аварийного возврата к программе центральной станции при неполучении сообщенияSpliceEnd_normal
или ошибке при его приеме.Avail_num
идентифицирует рекламный слот внутри программы с идентификаторомUnique_program_id
. Каждый последующий слот должен иметь инкрементированныйAvail_num
. Нулевое значение игнорируется.Avails_expected
указывает на общее количество слотов внутри программы с идентификаторомUnique_program_id
. ОбычноAvail_num
меньше или равенAvails_expected
. Для программ, хронометраж которых заранее точно не известен (прямые трансляции спортивных событий), значениеAvail_num
может превышатьAvails_expected
в интервале «перебора» запланированного хронометража программы.Auto_return_flag
передает информацию о планируемом режиме выхода из рекламного брейка. Ненулевое значение совместно с полемBreak_duration
указывает на автоматический возврат к программе центральной станции по истечении времени рекламного брейка без отправки командыSpliceEnd_normal
. Нулевое значение указывает на ожидание команды с сообщениемSpliceEnd_normal
.
Передача данных между командами SCRTE-104 Splice_request
и SCTE-35 Splice_insert
На рис. 2-1 показана та часть данных сообщения SCTE-35 Splice_insert
, которая формируется на основе информации, принятой инжектором в составе сообщения SCTE-104 Splice_request
.
Поля Splice_event_id
, Unique_program_id
, Avail_num
, Avails_expected
переносятся из байтового (SCTE-104) в битовое (SCTE-35) представление без изменений.
Данные Pre-roll_time
переходят в два поля – Time_specified_flag
и Pre-roll_time
, при этом мера времени меняется от счета миллисекунд к счету отметок времени PTS. Битовое поле Time_specified_flag
, равное 1, указывает на последующую передачу данных Pre-roll, нулевой флаг указывает на отсутствие передачи данных Pre-roll. При этом значение Pre-roll_time
в сообщении SCTE-35 практически всегда будет отличаться от этого же значения в сообщении SCTE-104 в большую сторону за счет учета задержки при кодировании.
Данные Break_duration
и Auto_return_flag
переходят в поля Auto_return
и Duration
, при этом мера времени меняется от счета десятых долей секунды к счету отметок времени PTS. Единичное значение флагов указывает на передачу длительности брейка и планирование его окончания в ЦРП по истечению времени Duration
без дополнительной команды от системы автоматизации. Нулевое значение флагов означает ожидание команды на окончание брейка от системы автоматизации. В этом случае значение Duration
может использоваться для дублирования возврата к сигналу центральной станции, если по каким-либо причинам команда на окончание брейка не поступит до истечения Duration
. Единичное значение битового поля Duration_flag
указывает на присутствие в сообщении SCTE-35 поля Duration
.
Битовый флаг Out_of_network_indicator
(OON
) сообщает о виде точки сплайсинга на основе данных Splice_insert_type
из сообщения SCTE-104. Единичное значение указывает на точку Splice In
, нулевое значение – на точку Splice Out
.
Битовый флаг Splice_immediate_flag
при нулевом значении указывает на нормальное планирование сплайсинга с использованием времени pre-roll. Если этот флаг равен единице, то требуется немедленное (Immediate Mode) выполнение сплайсинга, при этом поля Time_specified_flag
и Pre-roll_time
в сообщении SCTE-35 не передаются.
Битовый флаг Splice_event_cancel_indicator
при единичном значении отменяет ранее запланированное событие сплайсинга с тем же идентификатором Splice_event_id
.
Битовый флаг Program_splice_flag
передается равным 1, если во входной точке сплайсинга планируется переключать все PID-компоненты транспортного потока. Это режим Program Splice Mode. Нулевое значение флага указывает на переключение только части PID-компонентов транспортного потока в режиме Component Splice Mode. В таком случае в составе сообщений SCTE-104/35 дополнительно к показанным на рис. 2-1 полям передается количество переключаемых компонентов Component Count
и за ним в цикле указывается PID переключаемого компонента (Component tag
) и время Pre-roll для переключения каждого компонента.
Различное форматирование одних и тех же данных сплайсинга в сообщениях SCTE-104 и SCTE-35 не препятствует их прямому и обратному преобразованию без потерь информации. Однако представление данных сплайсинга чаще используется именно в формате полей Splice_request
, как более удобное для человеческого восприятия.
Взаимодействие компонентов системы DPI при выполнении брейка
На рис. 2-2 показано взаимодействие компонентов системы DPI на примере выполнения старта и окончания брейка в нормальном режиме.
Предполагается, что система автоматизации и инсертер взаимодействуют по двунаправленному соединению TCP/IP в локальной сети ЦФП, сплайсер и рекламный сервер также взаимодействуют по соединению TCP/IP, но уже в пределах локальной сети ЦРП. В ответ на инициирующее сообщение адресат отвечает подтверждающим сообщением. Взаимодействие между инсертером и инжектором, а также между инжектором и сплайсером – однонаправленное. В первом случае транспорт сообщений происходит по интерфейсу SDI, во втором – по интерфейсу MPEG-2 TS.
Сессия вставки регионального брейка начинается с отправки системой автоматизации сообщения Splice_request
с параметром SpliceStart Normal
. Инсертер вставляет данные Splice_request
в пакет VANC ближайшего кадра. Если поле Timestamp()
содержит ненулевое значение времени UTC, то инжектор именно в это время должен отправить сообщение Splice_insert
, в котором значение Out_of_network_indicator
(OON
) равно 1. Если же поле Timestamp()
равно 0, то инжектор отправляет сообщение Splice_insert
немедленно.
На рис. 2-2 предполагается, что задержка сообщений TCP/IP существенно меньше критической для систем DPI длительности одного кадра. Задержки в интерфейсах SDI и MPEG-2 TS могут превышать это время, причем существенно. Спецификации SCTE-104/35 разработаны именно таким образом, чтобы нивелировать влияние задержек в интерфейсах SDI и MPEG-2 TS на кадровую точность выполнения вставки брейков. Сообщения SCTE-104/35 претерпевают такие же задержки, что и несущий их сигнал – SDI или MPEG-2 TS. Время задержки не имеет значения, вставка регионального брейка произойдет корректно даже при задержке сигнала на несколько часов. В тракте передачи потока MPEG-2 TS между центром компрессии и ЦРП задержки могут быть не только порядка нескольких секунд, но и иметь джиттер. Чтобы максимально исключить влияние задержки и джиттера на точность вставки, время pre-roll в сообщении отсчитывается в формате времени PTS. Обрывы PTS будут влиять на точность вставки, только если они произошли внутри относительно короткого интервала времени pre-roll.
Обмен сообщениями между сплайсером и рекламным сервером (помечены*) нормируется в документе [SCTE 30]. Сразу же после приема Splice_insert
(OON=1
) сплайсер отправляет на рекламный сервер запрос Cue_request
на воспроизведение рекламного блока. В это сообщение переходят все данные сплайсинга из Splice_insert
(OON=1
), поэтому сервер получает всю необходимую информацию, в том числе и время pre-roll. Идентифицировать требуемый файл или лист воспроизведения рекламный сервер может, например, по значению Splice_Event_ID
. Не более, чем за 3 с до начала брейка, сервер извещает сплайсер о своей готовности сообщением Splice_request
. Через интервал времени pre-roll сервер посылает поток MPEG- 2 TS на канал ввода сплайсера, сплайсер переключает потоки и уведомляет об этом сервер отправкой сообщения Splice_complete
.
Выход из брейка в нормальном режиме происходит по такой же схеме взаимодействия. Отличие в том, что сообщение Splice_request
от системы автоматизации отправляется с параметром SpliceEnd Normal
, в Splice_insert
поле OON=0
, сплайсер отправляет в адрес сервера только одно сообщение Splice_complete
об окончании брейка. Сервер заканчивает воспроизведение регионального брейка по его запланированному хронометражу.
При выполнении старта или окончания брейка в режиме Immediate
время pre-roll не учитывается, сплайсинг выполняется в ближайшей возможной точке переключения потоков. Для старта брейка в таком режиме сервер должен обеспечивать минимально возможное время подготовки.