DAI Early Ad Break Notification API

使用 Google DAI 平台时,您可能需要为视频流中下一个即将进行的直播/线性广告插播提供定位数据。借助提前广告插播通知 (EABN) API,您可以使用键值对实现特定于广告插播时间点的定位,从而为高流量流中的广告决策提供可伸缩性。

对 EABN API 的调用必须包含要定位的素材资源键以及下一次广告插播的预期时长。此时长需要尽可能接近实际的广告插播时长。如果发送的预期时长短于所提供的广告插播时长,系统会使用填充不足时的广告插播时间点填充类型(默认为空白可选广告)。如果发送的预期时长超过提供的广告插播时长,您的广告插播时间点可能在广告结束之前结束。

除了这些必填字段之外,您还可以发送自定义定位参数、要应用的广告连播模板的名称或 SCTE35 Cue Out 数据(如果有)。

前提条件

创建服务账号

如需访问 EABN API,您需要拥有 Google 服务帐号。

  • 如果您有 Google Cloud 帐号,则可以使用 IAM 模块创建服务帐号。如需了解详情,请参阅创建和管理服务账号
  • 如果您还没有 Google Cloud 帐号,可以按照以下步骤在 Google API 控制台中创建服务帐号:
    1. 创建新项目或选择现有项目。
    2. 凭据页面中,点击管理服务帐号
    3. 服务帐号页面中,点击创建服务帐号
    4. 创建服务帐号页面中,输入帐号详细信息。然后点击创建

成功创建服务帐号后,复制该帐号的 JSON 密钥,该密钥将用于身份验证。

启用 EABN API

创建服务帐号后,请让您的客户经理为该帐号启用 EABN API。

启用 DAI API

为您的服务帐号启用 EABN API 后,请为该帐号启用 DAI API:

  1. Google API 库中,搜索“DAI API”。

  2. 选择并启用 DAI API。

使用 EABN API

您可以使用 JSON/REST 请求调用 EABN API。

身份验证

如需对 EABN API 进行经过身份验证的调用,您需要使用服务帐号中的 JSON 密钥和范围 https://www.googleapis.com/auth/video-ads 生成 OAuth2 服务帐号凭据。如需了解详情,请参阅针对服务器到服务器应用使用 OAuth 2.0

每次调用 EABN API 时,都必须包含生成的身份验证令牌,作为 Auth 标头。

发送广告插播提前通知

如需发送广告插播提前通知,请使用以下网址和请求正文发送 POST 请求:

POST dai.googleapis.com/v1/adBreaks

请求正文

对象
adBreak 必需 adBreak 属性的封装容器对象
assetKey 必需 创建广告插播时间点的 LiveStreamEvent 的唯一标识符
expectedDuration 必需 此广告插播的时长,使用 Google 的标准时长格式(xx.xxxs,其中 xx.xxx 表示秒数)
scte35CueOut 可选 scte35 cue out 中的 Base-64 编码数据。可以包含 splice_insert()time_signal() 命令。
示例:
  • time_signal()
    /DA0AAAAAAAA///wBQb+cr0AUAAeAhxDVUVJSAAAjn/PAAGlmbAICAAAAAAsoKGKNAIAmsnRfg==
  • splice_insert()/DAvAAAAAAAA///wFAVIAACPf+/+c2nALv4AUsz1AAAAAAAKAAhDVUVJAAABNWLbowo=
custParams 可选 这些键值对会添加到此广告插播时间点的广告请求中,以便在 AM360 中执行自定义条件定位,以 = 分隔并通过 & 联接。
示例:
key=value&key2=value2,value3
如需详细了解定位,请参阅向视频流提供定位参数
ptpln 可选 广告连播模板名称

响应标头

HTTP/1.1 200 OK

响应正文

响应正文包含 adBreak 对象中发送的所有参数,以及一个额外的 daiBreakId 字段(其中包含视频流内创建的广告插播时间点的内部 DAI 标识符)。

示例

请求

POST /v1/adBreaks HTTP/1.1
Content-Type: application/json

{
  "adBreak": {
    "assetKey": "asset1",
    "expectedDuration": "30s",
    "scte35CueOut": "/DA0AAAAAAAA///wBQb+cr0AUAAeAhxDVUVJSAAAjn/PAAGlmbAICAAAAAAsoKGKNAIAmsnRfg==",
    "custParams": "param1=value1&param2=value2",
    "ptpln": "podtemplate"
  }
}

响应

HTTP/1.1 200 OK

{
  "assetKey": "asset1",
  "expectedDuration": "30s",
  "custParams": "param1=value1&param2=value2",
  "scte35CueOut": "/DA0AAAAAAAA///wBQb+cr0AUAAeAhxDVUVJSAAAjn/PAAGlmbAICAAAAAAsoKGKNAIAmsnRfg==",
  "ptpln": "podtemplate",
  "daiBreakId": 1
}

示例实现 (Python)

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

from absl import app

from google.auth.transport.requests import AuthorizedSession
from google.oauth2 import service_account

SERVICE_ACCOUNT_KEY_FILE = "~/eabn_key.json"
ASSET_KEY = "asset1"

SCOPES = ['https://www.googleapis.com/auth/video-ads']
EABN_API_URL = 'https://dai.googleapis.com/v1/adBreaks'


def main():
  credentials = service_account.Credentials.from_service_account_file(
      SERVICE_ACCOUNT_KEY_FILE, scopes=SCOPES)

  authed_session = AuthorizedSession(credentials)

  data = {
      'assetKey': ASSET_KEY,
      'expectedDuration': '120s',
      'custParams': 'param1=value1&param2=value2',
      'scte35CueOut': '/DA0AAAAAAAA///wBQb+cr0AUAAeAhxDVUVJSAAAjn/PAAGlmbAICAAAAAAsoKGKNAIAmsnRfg==',
  }

  r = authed_session.post(EABN_API_URL, json={'adBreak': data})
  print(r.status_code)
  print(r.headers)
  print(r.text)

if __name__ == '__main__':
  app.run(main)