Для отслеживания позиций зрителей и событий объявлений на стороне клиента IMA DAI SDK использует метаданные, встроенные в медиасегменты потока (внутриполосные метаданные) или в файл манифеста потоковой передачи (метаданные в манифесте). Метаданные доступны в потоке динамической вставки объявлений в разных форматах в зависимости от типа воспроизводимого потока. IMA DAI SDK обрабатывает все форматы метаданных через один API.
Приложение должно собирать метаданные и передавать их в IMA DAI SDK. Для передачи этой информации в SDK предусмотрен метод StreamManager.onMessage(). Этот метод пересылает метаданные в виде объекта msg, предоставленного портом roVideo. Затем эти объекты обрабатываются IMA DAI SDK, чтобы определить время рекламных событий. Она принимает один аргумент:
msg– объект типа msg, предоставляемый портом roVideo.
Образец кода метаданных
Ниже приведен пример того, как обрабатывать метаданные из порта roVideo и передавать их в IMA DAI SDK через StreamManager.onMessage().
Sub runLoop()
' Forward all timed metadata events to IMA.
m.top.video.timedMetaDataSelectionKeys = ["*"]
' Cycle through all the fields and set listeners.
' IMPORTANT: Failure to listen to the position and timedmetadata fields could
' result in ad impressions not being reported.
m.port = CreateObject("roMessagePort")
fields = m.top.video.getFields()
for each field in fields
m.top.video.observeField(field, m.port)
end for
while True
msg = wait(1000, m.port)
if m.top.video = invalid
print "exiting"
exit while
end if
m.streamManager.onMessage(msg)
currentTime = m.top.video.position
If currentTime > 3 And not m.top.adPlaying
m.top.video.enableTrickPlay = true
End If
end while
End Sub
Подробную информацию о том, как добавить в приложение метаданные потока для обработки циклов, можно найти в руководстве по началу работы с IMA Roku. В разделе Прослушиватель событий и начало трансляции руководства содержится цикл обработки метаданных.
Требования к формату и контейнеру потока
Чтобы включить клиентское отслеживание рекламы на устройствах Roku, необходимо использовать сегменты медиаконтента в потоке с динамической вставкой объявлений, упакованные в поддерживаемый формат контейнера. Это позволяет Roku OS извлекать временные метаданные.
Roku Media Player поддерживает извлечение метаданных ID3 из следующих контейнеров:
- MPEG-2 Transport Stream (TS)
- Fragmented MP4
- Common Media Application Format (CMAF)
Необработанные элементарные аудиопотоки, например необработанные сегменты AAC, не поддерживаются для временных метаданных в Roku OS. Roku Media Player не может извлекать временные метаданные ID3 из необработанных аудиопотоков AAC, поэтому IMA SDK не получает события метаданных и не отправляет веб-маяки для отслеживания или показа объявлений. Для всех потоков, содержащих только аудио, и потоков с аудиоверсиями необходимо использовать потоки с поддерживаемым форматом контейнера, например TS, MP4 или CMAF.
Потоки HLS CMAF
Потоки HLS с динамической вставкой объявлений в линейный контент, в которых используется Common Media Application Framework (CMAF), передают временные метаданные через внутриполосные блоки eMSGv1 в соответствии со стандартом ID3 через CMAF. Эти блоки eMSG встраиваются в начале каждого сегмента медиаконтента, и каждый блок ID3 eMSG содержит метку PTS, относящуюся к последнему разрыву в потоке.
Для IMA Roku все потоки HLS CMAF отправляют внутриполосные данные ID3 в формате eMSGv0. IMA объединяет информацию, предоставленную в формате eMSGv0, с информацией из видеообъекта.
Чтобы обеспечить правильную обработку событий ID3 в потоке HLS CMAF, необходимо отправить объект видео в запросе потока с помощью StreamRequest.videoObject.