Использование меток 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 не учитывается, сплайсинг выполняется в ближайшей возможной точке переключения потоков. Для старта брейка в таком режиме сервер должен обеспечивать минимально возможное время подготовки.
