处理线性 DAI 视频流中的定时元数据

互动式媒体广告 (IMA) 动态广告插播 SDK (DAI) 依靠嵌入视频流媒体片段(带内元数据)或流式传输清单文件(清单内元数据)中的元数据信息来跟踪观看者的位置和客户端广告事件。DAI 视频流中的元数据可采用不同的格式,具体取决于播放的视频流类型。Roku IMA SDK 通过单个 API 处理所有元数据格式。

您的应用负责捕获元数据并将其转发到 IMA DAI SDK。SDK 提供了 StreamManager.onMessage() 方法来传递此信息。此方法以 roVideo 端口提供的 msg 对象的形式转发元数据。然后,IMA DAI SDK 会处理这些对象,以确定广告事件的时间。它接受一个参数:

  • msg:roVideo 端口提供的消息类型对象。

元数据示例代码

以下示例说明了如何处理来自 roVideo 端口的元数据并通过 StreamManager.onMessage() 将其传递给 IMA SDK。

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 入门指南。本指南的事件监听器和流开始部分包含元数据处理循环。

HLS CMAF 视频流

使用通用媒体应用框架 (CMAF) 的线性 DAI HLS 视频流按照从 ID3 到 CMAF 的标准通过带内 eMSGv1 框传递定时元数据。这些 eMSG 框嵌入每个媒体段的开头,其中每个 ID3 eMSG 都包含相对于流中最后一个不连续性的 PTS。

对于 IMA Roku,所有 HLS CMAF 视频流都会使用 eMSGv0 格式发送带内 ID3 数据。 IMA 会将 eMSGv0 格式提供的信息与视频对象中的信息相结合。

如需正确解析 HLS CMAF 数据流 ID3 事件,您必须使用 StreamRequest.videoObject 在数据流请求中发送视频对象。