插入包含广告插播时间元数据的广告

本指南介绍了如何使用广告连播时段时间元数据 (ATM) 方法插入广告插播时段,以获取广告插播时段(包括前贴片广告)的精确时间和时长。

若要插入前贴片广告并在中贴片广告插播时间点结束后返回内容,我们建议调用以下 API:

(可选)对于高并发直播活动,我们建议您调用广告插播时间点提前通知 (EABN) API,以便在广告插播开始之前安排广告决策。

前提条件

首先,您需要设置一个直播活动,并将其动态广告插播 (DAI) 类型设为广告连播投放重定向。选择以下方法之一:

检索内容流

当用户选择直播活动时,客户端应用会向 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,以便为广告拼接做好准备。

检索广告连播时间元数据

如需检索广告连播时间,请按以下步骤操作:

  1. 生成 HMAC 令牌
  2. 使用 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"

中贴片广告的请求时间元数据

如需检索中贴片的广告连播元数据,请按以下步骤操作:

  1. 解析直播清单,以查找包含每个中贴片广告插播时间点和时长的广告标记。
  2. 调用 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-INEXT-X-CUE-OUT 标记,它们分别表示广告插播的开始和结束。

EXT-X-CUE-INEXT-X-CUE-OUT 标记替换为 EXT-X-DISCONTINUITY 元素,以便客户端视频播放器在内容和广告之间切换。

以下示例清单替换了 EXT-X-CUE-INEXT-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:17.450
#EXTINF:5.000,
contentorigin.com/3.ts
#EXTINF:5.000,
contentorigin.com/4.ts
#EXTINF:5.000,
contentorigin.com/5.ts
#EXTINF:2.450,
contentorigin.com/6.ts
#EXT-X-CUE-IN
#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/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.000,
contentorigin.com/1.ts
#EXTINF:5.000,
contentorigin.com/2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
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.000,
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.000,
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
#EXTINF:2.450,
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/3.ts?stream_id=SESSION_ID
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
contentorigin.com/7.mp4
#EXTINF:5.000,
contentorigin.com/8.mp4

构建补位广告片段

如需填充广告与内容之间的间隙,请插入补位广告片段。 使用 ATM API 的 JSON 响应中的 slates.segment_durations.values 数组来确定每个广告插播片段的时长。根据需要循环播放片段时长序列,以填充整个广告插播时间点。

如需在广告连播结束之前返回到内容,例如在检测到 EXT-X-CUE-IN 标记时,请将 d= 参数添加到最终补位内容片段的网址中。此参数会缩短片段,以避免影响客户端视频播放器的时间轴。d= 参数的值必须是整数,表示缩短片段的时长(以毫秒为单位)。

以下示例组装了一个插播广告片段:

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

管理返回内容

在清单操纵器插入广告连播中的所有片段后,清单操纵器必须转换回内容流。如需切换回内容流,请选择以下方法之一。每种方法都需要一个最终的重新对齐分段,以确保流时间轴的准确性。

填充和重新对齐:插入口板片段并循环播放口板。 填充时长,并在每次 slate 迭代之间插入 EXT-X-DISCONTINUITY 元素。对于最后一个片段,请附加 d= 参数(以毫秒为单位),以匹配内容开始时间。

立即返回:使用 d= 参数插入单个重新对齐的插播广告片段,然后插入内容。

视频播放器会恢复到内容,时间轴不会发生变化。

以下示例通过使用补位广告片段填充广告插播时间点的剩余时间来创建过渡。

#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-DISCONTINUITY
#EXTINF:5.000,
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.000,
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.000,
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
#EXT-X-DISCONTINUITY
#EXTINF:2.450,
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/1.ts?stream_id=SESSION_ID&d=2450
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
contentorigin.com/7.mp4
#EXTINF:5.000,
contentorigin.com/8.mp4

在此方法中,清单操纵器会根据需要循环播放板片,并且仅将 d= 网址参数附加到最后一个板片片段。此过程与基础内容的预定开始时间完全一致。

以下示例展示了如何使用 d= 参数来使用单个插播广告片段,以便在您不使用循环播放的插播广告片段填充整个剩余的广告时段时,帮助保持播放器时间轴的准确性。

#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-DISCONTINUITY
#EXTINF:5.000,
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.000,
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.000,
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:2.450,
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&d=2450
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
contentorigin.com/7.mp4
#EXTINF:5.000,
contentorigin.com/8.mp4

可选:安排广告插播时间点

为了提高填充率,请发送包含广告连播时长、自定义定位参数和 SCTE-35 信号数据的广告插播提前通知 (EABN)。如需了解详情,请参阅发送提前广告插播时间点通知