本指南介绍了如何使用广告连播时间元数据 (ATM) 方法插入广告插播时间点,以获取广告插播时间点的精确时间和时长,包括前贴片广告。
如需插入前贴片广告并管理中贴片广告插播时间点后返回内容,我们建议您调用以下 API:
- 广告连播时间元数据 (ATM) API: 查询广告连播决策结果,包括广告和补位广告时长。
- 广告片段 端点: 请求广告或补位广告片段,并可以选择终止当前广告 连播。
(可选)对于高并发直播活动,我们建议您调用 广告插播时间点提前通知 (EABN) API ,以便在广告插播时间点开始之前安排广告决策。
前提条件
如需开始使用,您需要为广告连播投放重定向 动态广告插播 (DAI) 类型设置直播活动。选择以下方法之一:
- Ad Manager 界面: 为 DAI设置直播。
- Ad Manager API: 使用客户端库(可用
选项)调用
LiveStreamEventService.createLiveStreamEvents方法。将LiveStreamEvent.dynamicAdInsertionType参数设置为POD_SERVING_REDIRECT。
检索内容流
当用户选择直播活动时,客户端应用会向 Google Ad Manager 发出流请求。在流响应中,应用会提取 Google DAI 会话 ID 和元数据,以包含在流清单请求中。
以下示例将 Google DAI 会话 ID 传递给清单操纵器:
https://MANIFEST_MANIPULATOR_URL/manifest.m3u8?DAI_stream_ID=SESSION_ID&network_code=NETWORK_CODE&DAI_custom_asset_key=CUSTOM_ASSET_KEY
在处理视频内容播放请求时,请存储请求中的 Google DAI 会话 ID 和 CUSTOM_ASSET_KEY,以便为 广告拼接做准备。
检索广告连播时间元数据
如需检索广告连播时间,请按以下步骤操作:
- 生成 HMAC 令牌。
- 使用 HMAC 令牌调用 ATM API。
请求前贴片广告的时间元数据
使用以下选项验证直播活动的前贴片广告设置:
如需检索前贴片广告决策结果,请向 ATM API 发出请求。
以下示例向 ATM 请求前贴片广告:
curl "https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/pod.json?stream_id=SESSION_ID&ad_break_id=preroll&auth-token=your_signed_HMAC_token"
请求中贴片广告的时间元数据
如需检索中贴片广告的广告连播元数据,请按以下步骤操作:
- 解析直播清单,找到包含每个中贴片广告插播时间点的时间和时长的广告标记。
- 调用 ATM API 端点,请求精确的广告连播和补位广告时长。该 API 会返回一个 JSON 对象,其中包含广告连播的决策结果。
以下示例向 ATM 请求中贴片广告:
curl "https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/pod.json?stream_id=SESSION_ID&ad_break_id=AD_BREAK_ID&pd=AD_BREAK_DURATION&auth-token=your_signed_HMAC_token"
如果成功,您会看到类似于以下 JSON 对象的输出:
{
"status": "final",
"ads": [
{
"duration_ms": 5046,
"variants": {
"devrel1428000": {
"segment_extension": "ts",
"segment_durations": {
"timescale": 1000,
"values": [
5045
]
}
},
"devrel1928000": {
"segment_extension": "ts",
"segment_durations": {
"timescale": 1000,
"values": [
5045
]
}
}
}
}
],
"slate": {
"duration_ms": 0,
"variants": {
"devrel1428000": {
"segment_extension": "ts",
"segment_durations": {
"timescale": 1000,
"values": [
5005,
...
5046
]
}
},
"devrel1928000": {
"segment_extension": "ts",
"segment_durations": {
"timescale": 1000,
"values": [
5005,
...
5046
]
}
}
}
}
}
将广告拼接到内容清单中
以下部分将引导您修改直播清单并添加广告片段。
识别广告插播时间点片段并插入不连续性
在处理每个变体清单时,请识别流中的 EXT-X-CUE-IN 和 EXT-X-CUE-OUT 标记,它们表示广告插播时间点的开始和结束。
将 EXT-X-CUE-IN 和 EXT-X-CUE-OUT 标记替换为 EXT-X-DISCONTINUITY 元素,以便客户端视频播放器在内容和广告之间切换。
以下示例清单替换了 EXT-X-CUE-IN 和 EXT-X-CUE-OUT 标记:
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5.000,
contentorigin.com/1.ts
#EXTINF:5.000,
contentorigin.com/2.ts
#EXT-X-CUE-OUT:15.000
#EXTINF:5.000,
contentorigin.com/3.ts
#EXTINF:5.000,
contentorigin.com/4.ts
#EXTINF:5.000,
contentorigin.com/5.ts
#EXT-X-CUE-IN
#EXTINF:5.000,
contentorigin.com/6.ts
#EXTINF:5.000,
contentorigin.com/7.mp4
#EXTINF:5.000,
contentorigin.com/8.mp4
以下示例展示了替换后的清单:
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5.000,
contentorigin.com/1.ts
#EXTINF:5.000,
contentorigin.com/2.ts
#EXTINF:5.000,
#EXT-X-DISCONTINUITY
{... Insert ad segments here ...}
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
contentorigin.com/6.mp4
#EXTINF:5.000,
contentorigin.com/7.mp4
#EXTINF:5.000,
contentorigin.com/8.mp4
Google DAI 广告片段未加密。如果您的内容已加密,请在每个广告插播时间点的第一个广告片段之前插入 EXT-X-KEY:METHOD=NONE 元素,以移除加密。在广告插播时间点结束时,通过插入适当的 EXT-X-KEY 重新添加加密。
记录即将到来的广告插播时间点的开始时间、时长和索引。
构建广告片段网址
将 EXT-X-DISCONTINUITY 标记之间的内容片段替换为每个广告片段的网址。如需确定要插入多少个广告片段,请使用 ATM API 的 JSON 响应中提供的 ads.segment_durations.values。
如需在检测到 EXT-X-CUE-IN 标记时提前结束广告连播,请将 d= 参数添加到最后一个广告片段的网址中。此参数会缩短片段,以避免影响客户端视频播放器的时间轴。
以下示例将前贴片广告片段网址组装到清单中。请注意,广告片段使用从 0 开始的索引:
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/preroll/ad/0/profile/ENCODING_PROFILE/0.ts?stream_id=SESSION_ID
以下示例将中贴片广告片段网址组装到清单中:
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/AD_BREAK_ID/ad/0/profile/ENCODING_PROFILE/0.ts?stream_id=SESSION_ID
以下示例将广告片段插入到清单中:
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5.00,
contentorigin.com/1.ts
#EXTINF:5.00,
contentorigin.com/2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.00,
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/AD_BREAK_ID/ad/0/profile/ENCODING_PROFILE/0.ts?stream_id=SESSION_ID
#EXTINF:5.00,
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/AD_BREAK_ID/ad/0/profile/ENCODING_PROFILE/1.ts?stream_id=SESSION_ID
#EXTINF:5.00,
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/AD_BREAK_ID/ad/0/profile/ENCODING_PROFILE/2.ts?stream_id=SESSION_ID
#EXT-X-DISCONTINUITY
#EXTINF:5.00,
contentorigin.com/6.mp4
#EXTINF:5.00,
contentorigin.com/7.mp4
#EXTINF:5.00,
contentorigin.com/8.mp4
构建补位广告片段
如需填充广告和内容之间的空白,请插入补位广告片段。
使用 ATM API 的 JSON 响应中的 slates.segment_durations.values 数组来确定每个补位广告片段的时长。根据需要循环播放片段时长序列,以填充整个广告插播时间点。
以下示例组装了一个补位广告片段:
https://dai.google.com/linear/pods/v1/adv/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/ad_break_id/AD_BREAK_ID/slate/0/profile/ENCODING_PROFILE/0.ts?stream_id=SESSION_ID
示例中的 slate/0 表示补位广告迭代次数。请参阅客户端视频播放器的兼容性和缓存功能,以确定是应从 0 开始并为补位广告的每个循环递增此数字,还是应在所有迭代中都将其保留为 0。
管理返回内容
插入广告连播中的所有片段后,请选择以下方法之一来转换回内容流:
| 方法 | 说明 | 对客户端视频播放器的影响 |
|---|---|---|
| 填充补位广告片段 | 插入补位广告片段并循环播放补位广告。填充时长并在每个补位广告迭代之间插入 EXT-X-DISCONTINUITY 元素。 |
无影响。 视频播放器会转换回内容,时间轴不会改变。 |
| 使用单个补位广告片段重新对齐 | 插入单个补位广告片段。使用 d= 参数填充时长,直到内容开始。 |
无影响。 视频播放器会转换回内容,时间轴不会改变。 |
| 立即返回 | 插入内容片段。 | 视频播放器的时间轴会改变。 您的客户端视频播放器必须处理改变后的时间轴。 |
可选:安排广告插播时间点
如需提高填充率,请发送广告插播时间点提前通知 (EABN),其中包含广告连播时长、自定义定位参数和 SCTE-35 信号数据。如需了解更多 详情,请参阅发送广告插播时间点提前 通知。