互动媒体广告 (IMA) 动态广告插播 SDK (DAI) 依赖于嵌入在媒体片段(带内元数据)或流媒体清单文件(清单内元数据)中的元数据信息来跟踪观看者的位置和客户端广告事件。元数据可通过 DAI 直播以不同格式提供,具体取决于正在播放的直播类型。IMA DAI SDK 通过单个 API 处理所有元数据格式。
您的应用负责捕获元数据并将其转发给 IMA DAI SDK。SDK 提供了 StreamManager.onMessage() 方法来传递此信息。此方法会转发由 roVideo 端口提供的 msg 对象形式的元数据。然后,IMA DAI SDK 会处理这些对象,以确定广告事件的时间。它接受一个实参:
msg:由 roVideo 端口提供的消息类型对象。
元数据示例代码
以下示例展示了如何处理来自 roVideo 端口的元数据,并通过 StreamManager.onMessage() 将其传递给 IMA DAI 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 入门指南。该指南的事件监听器和流启动部分包含元数据处理循环。
直播格式和容器要求
若要在 Roku 上启用客户端广告跟踪,您必须使用 DAI 流中采用受支持的容器格式打包的媒体段。此进程可让 Roku OS 提取定时元数据。
Roku 媒体播放器支持在以下容器格式中提取带内 ID3 元数据:
- MPEG-2 传输流 (TS)
- 分段 MP4
- 通用媒体应用格式 (CMAF)
Roku OS 不支持原始基本音频流(例如原始高级音频编码 [AAC] 片段)上的定时元数据。Roku 媒体播放器无法从原始 AAC 音频流中提取 ID3 定时元数据,这会导致 IMA SDK 无法接收元数据事件并发送广告展示或跟踪信标。对于所有纯音频和音频演绎版视频流,您必须使用采用受支持的容器格式封装的视频流,例如 TS、MP4 或 CMAF。
HLS CMAF 流
使用通用媒体应用框架 (CMAF) 的线性 DAI HLS 流会按照 ID3 通过 CMAF 标准,通过带内 eMSGv1 box 传递定时元数据。这些 eMSG 框嵌入在每个媒体段的开头,每个 ID3 eMSG 都包含一个相对于信息流中上次不连续性的 PTS。
对于 IMA Roku,所有 HLS CMAF 流都使用 eMSGv0 格式发送带内 ID3 数据。IMA 将 eMSGv0 格式提供的信息与视频对象中的信息相结合。
为了能够正确解析 HLS CMAF 流 ID3 事件,您必须使用 StreamRequest.videoObject 在流请求中发送视频对象。