广告标记

本指南介绍了 Video Stitcher API 支持的广告标记。Video Stitcher API 会根据直播的来源 HLS/DASH 清单中的广告标记来识别广告插播时间点边界,并在直播的每个会话中在广告插播时间点内执行广告拼接。

准备工作

确保您熟悉 Video Stitcher API 中的介绍性概念和术语。如需了解详情,请参阅技术概览

请参阅 SCTE-35 规范 Digital Program Insertion Cueing Message For Cable

SCTE-35 命令

直播广告标记由标准 SCTE-35 信号表示。 在 SCTE-35 命令列表中,Video Stitcher API 支持以下两个命令:

  • splice_insert
  • time_signal

借助 time_signal,您可以在第一个细分中的唯一节目标识符 (UPID) 中为关联的广告插播提供其他任意元数据。

Video Stitcher API 预期 segmentation_upid_type0x0C,表示 MPU()MPU() 中的 private_data 应为采用 base64 编码的 JSON 字符串,其中某些 JSON 键专用于以下特定用途:

  • %%AD_TAG_ID%%:指定要用于广告插播的广告代码。广告代码 ID 应是直播会话 adTagMacros 中的键之一。
  • %%SLATE_ID%%:指定要用于广告插播的广告信息。播出信息 ID 必须与同一 Google Cloud 项目中已创建的播出信息的 ID 一致。

UPID 载荷中的所有其他键值对都用于广告代码宏替换。

例如,如果广告代码 URI 为 https://example.com?key=[foo]private_dataeyJmb28iOiJiYXIifQ==(即 {"foo":"bar"} 的 base64 表示法),Video Stitcher API 会将 [foo] 替换为 bar,并向 https://example.com?key=bar 发出广告代码请求。

对于 Google Ad Manager 集成工作流,SCTE35 消息可能包含可在广告代码中替换的特定值。请参阅支持的宏列表

确保在实时配置中注册的 adTagUri 包含所选宏。

例如,如果 SCTE35 消息传递 %%SPLICE_INSERT_EVENT_ID%% 的值,请确保 adTagUri 上存在该宏,如以下示例所示:

AD_TAG_URI&macro=%%SPLICE_INSERT_EVENT_ID%%

当 Video Stitcher API 请求广告元数据且 splice_insertSCTE35 消息将 splice_insert_event_id 设为 123 时,它会使用以下广告代码:

AD_TAG_URI&macro=123

HLS 广告标记

EXT-X-DATERANGE

HTTP Live Streaming 规范中指定了使用 #EXT-X-DATERANGE

  • 具有 SCTE35-OUT 属性的 #EXT-X-DATERANGE 标记表示广告插播的立即开始接合点。
  • 具有 SCTE35-IN 属性的 #EXT-X-DATERANGE 标记表示广告插播的即时结束接合点。
  • SCTE35-OUTSCTE35-IN 的值应采用十六进制编码。

示例:

#EXT-X-DATERANGE:ID="111",START-DATE=START_DATE,SCTE35-OUT=0xFC302000000000000000FFF00F050000006F7FFF7E002932E0000000000000235EE5EF
...
#EXT-X-DATERANGE:ID="111",START-DATE=START_DATE,END-DATE=END_DATE,SCTE35-IN=0xFC302000000000000000FFF00F050000006F7F7F7E002932E0000000000000D56C4036

EXT-X-CUE-OUT 和 EXT-X-CUE-IN

#EXT-X-CUE-OUT 标记表示立即开始广告插播,#EXT-X-CUE-IN 标记表示立即结束广告插播。

#EXT-OATCLS-SCTE35 标记可用于 SCTE-35 消息,并且值应采用 base64 编码。

示例(不含 SCTE-35 消息):

#EXT-X-CUE-OUT:DURATION=30
...
#EXT-X-CUE-IN

示例(包含 SCTE-35 消息):

#EXT-OATCLS-SCTE35:/DBBAAAAAAAAAP/wBQb+AAaXgAArAilDVUVJAAAAb3//AAApMuAMFXslJUFEX1RBR19JRCUlOnRhZy0xfTQAALOJefk=
#EXT-X-CUE-OUT:30
...
#EXT-X-CUE-IN

如果指定了 EXT-X-CUE-OUT 代码的时长,则该值优先,即使 SCTE-35 消息中的广告插播时长与之冲突也是如此。如果未指定 EXT-X-CUE-OUT 标记的持续时间,并且在关联的 SCTE-35 消息中指定了持续时间,则系统会使用 SCTE-35 消息中的值。

DASH 广告标记

目前,Video Stitcher API 仅支持多时段 DASH 清单。在多时段 DASH 清单中,广告插播时段应由包含 cue-out 标记的事件流的 Period 表示。不需要 cue-in 标记,因为广告插播时间段的结束表示广告插播结束。

如果广告插播时间段的 SCTE-35 事件串中显示多个 cue-out 事件,Video Stitcher API 将仅使用第一个事件。系统会忽略 cue-out 事件的呈现时间,因为广告插播时间与时段的开始时间相同。

以下是 SCTE-35 事件流支持的 schemeIdUri 列表:

  • urn:scte:scte35:2014:xml+bin
  • urn:scte:scte35:2013:xml

urn:scte:scte35:2014:xml+bin

schemeIdUri 设置为 urn:scte:scte35:2014:xml+bin 的事件流包含以 base64 编码的二进制形式表示 SCTE-35 消息的事件。

示例:

  <Period start="PT444334H55M0.010S" id="break-1">
    <EventStream schemeIdUri="urn:scte:scte35:2014:xml+bin" timescale="90000">
      <Event presentationTime="0" duration="5400000" id="1">
        <Signal xmlns="urn:scte:scte35:2014:xml+bin">
          <Binary xmlns="urn:scte:scte35:2014:xml+bin">/DBTAAAAAAAAAP/wBQb+AAaXgAA9AjtDVUVJAAAAAH//AABSZcAMJ3siJSVBRF9UQUdfSUQlJSI6InRhZy0xIiwiZGFzaCI6InRydWUifTQAABxkspA=</Binary>
        </Signal>
      </Event>
    </EventStream>
    ...
  </Period>

urn:scte:scte35:2013:xml

schemeIdUri 设置为 urn:scte:scte35:2013:xml 的事件流包含以纯 XML 表示 SCTE-35 消息的事件。

示例:

  <Period start="PT444334H55M0.010S" id="break-1">
    <EventStream timescale="90000" schemeIdUri="urn:scte:scte35:2013:xml">
      <Event duration="5400000">
        <scte35:SpliceInfoSection protocolVersion="0" ptsAdjustment="140429" tier="4095">
          <scte35:SpliceInsert spliceEventId="1" spliceEventCancelIndicator="false" outOfNetworkIndicator="true" spliceImmediateFlag="false" uniqueProgramId="1" availNum="1" availsExpected="1">
            <scte35:Program><scte35:SpliceTime ptsTime="5672624400"/></scte35:Program>
            <scte35:BreakDuration autoReturn="true" duration="5400000"/>
          </scte35:SpliceInsert>
        </scte35:SpliceInfoSection>
      </Event>
    </EventStream>
    ...
  </Period>

直播的广告插播提前通知

对于实时拼接,当 Video Stitcher API 在直播的清单中收到 cue-out 广告标记时,会同步处理广告代码。这种同步处理会触发大量广告代码请求,如果直播流量非常大,则会导致直播会话的播放请求出现长时间延迟。

广告插播提前通知 (EABN) 会通知 Video Stitcher API 即将到来的广告插播时间点,从而为该 API 准备广告留出更多时间。

HLS 广告插播提前通知

如需通知 API 即将到来的广告插播时间点,以便 API 提前准备广告,直播的 HLS 播放列表必须:

  • 使用 #EXT-X-DATERANGEEXT-X-CUE-OUT 作为广告标记
  • 在直播的源清单中重复提示广告插播时间点的标记

#EXT-X-DATERANGE

当源编码器安排即将到来的广告插播时,它可以将 #EXT-X-DATERANGE cue-out 标记插入源清单中。标记的 X-TYPE 属性表示广告标记的类型;对于提前广告插播通知,X-TYPE 的值应为 EABN。标记的 START-TIME 属性表示实际或计划的广告插播开始时间。标记的 DURATION 属性是必需属性,用于指明广告插播时长。此标记称为 EABN cue-out

在广告插播实际开始时,来源编码器必须将 #EXT-X-DATERANGE cue-out 标记插入来源清单中。标记的 ID 属性必须与相应的 EABN 提示信息相同。标记的 START-TIME 必须与插入此标记的片段的媒体时间相同。此标记称为即时提示

以下示例清单包含一个 EABN cue-out、一个即时 cue-out 和一个 cue-in:

#EXTM3U
#EXT-X-TARGETDURATION:4
#EXT-X-VERSION:7
#EXT-X-PROGRAM-DATE-TIME:2020-11-08T21:11:20.976Z
#EXT-X-MEDIA-SEQUENCE:239959
#EXT-X-DISCONTINUITY-SEQUENCE:2
#EXT-X-DATERANGE:ID="2415919105",X-TYPE="EABN",START-DATE="2020-11-08T21:11:28.976Z",DURATION=29.988,SCTE35-OUT=0xFC303...
#EXTINF:4.000,
1028/segment_239959.ts
#EXTINF:4.000,
1028/segment_239960.ts
#EXT-X-DATERANGE:ID="2415919105",START-DATE="2020-11-08T21:11:28.976Z",DURATION=29.988,SCTE35-OUT=0xFC303...
#EXTINF:4.000,
1028/segment_239961.ts
#EXTINF:4.000,
1028/segment_239962.ts
#EXTINF:4.000,
1028/segment_239963.ts
...
#EXT-X-DATERANGE:ID="2415919105",END-DATE="2020-11-08T21:11:48.976Z",SCTE35-IN=0xFC303...
#EXTINF:4.000,
1028/segment_239968.ts

#EXT-X-CUE-OUT

  • 使用 #EXT-X-CUE-OUT 作为广告标记
  • 在直播的源清单中重复提示广告插播时间点的标记

当源编码器安排即将到来的广告插播时间点时,还可以将 #EXT-X-CUE-OUT cue-out 标记插入源清单中。标记的 X-TYPE 属性表示广告标记的类型;对于提前广告插播通知,X-TYPE 的值应为 EABN。标记的 DURATION 属性必须指明广告插播时长。此标记称为 EABN cue-out

在广告插播实际开始时,来源编码器必须将 #EXT-X-CUE-OUT cue-out 标记插入来源清单中。标记的 ID 属性必须与相应的 EABN 提示信息相同。此标记称为即时 cue-out

以下示例清单包含一个 EABN cue-out、一个即时 cue-out 和一个 cue-in:

#EXTM3U
#EXT-X-TARGETDURATION:4
#EXT-X-VERSION:7
#EXT-X-PROGRAM-DATE-TIME:2020-11-08T21:11:20.976Z
#EXT-X-MEDIA-SEQUENCE:239959
#EXT-X-DISCONTINUITY-SEQUENCE:2
#EXT-OATCLS-SCTE35:0xFC303...
#EXT-X-CUE-OUT:ID="2415919105",X-TYPE="EABN",DURATION=29.988
#EXTINF:4.000,
1028/segment_239959.ts
#EXTINF:4.000,
1028/segment_239960.ts
#EXT-OATCLS-SCTE35:0xFC303...
#EXT-X-CUE-OUT:ID="2415919105",DURATION=29.988
#EXTINF:4.000,
1028/segment_239961.ts
#EXTINF:4.000,
1028/segment_239962.ts
#EXTINF:4.000,
1028/segment_239963.ts
...
#EXT-X-CUE-IN:ID="2415919105"
#EXTINF:4.000,
1028/segment_239968.ts

DASH 广告插播提前通知

如需通知 API 即将到来的广告插播时间点,以便 API 提前准备广告,DASH 直播清单必须在 Main PeriodAd Break Period 中重复广告标记事件。

Main Period 中首次出现时,会通知 API 即将有广告插播,在 Ad Break Period 中第二次出现时,表示广告插播即将开始。

以下是一个清单示例:

<MPD>
<Period id="1">
   <!-- Main Period -->
   <EventStream timescale="90000"  schemeIdUri="urn:scte:scte35:2013:xml">
     <Event duration="5400000" presentationTime="53460000" id="1">
       <scte35:SpliceInfoSection>
          <scte35:SpliceInsert outOfNetworkIndicator="true" spliceImmediateFlag="true">
            <scte35:BreakDuration autoReturn="true" duration="5400000"/>
            </scte35:SpliceInsert>
        </scte35:SpliceInfoSection>
      </Event>
    </EventStream>
   ...
</Period>

<Period start="PT9M54S" id="2">
    <!-- Ad Break Period -->
   <EventStream timescale="90000"  schemeIdUri="urn:scte:scte35:2013:xml">
     <Event duration="5400000" id="1">
       <scte35:SpliceInfoSection>
          <scte35:SpliceInsert outOfNetworkIndicator="true" spliceImmediateFlag="true">
            <scte35:BreakDuration autoReturn="true" duration="5400000"/>
            </scte35:SpliceInsert>
        </scte35:SpliceInfoSection>
      </Event>
    </EventStream>
   ...
</Period>

<Period start="PT10M54S" id="3">
    <!-- Main Period -->
    ...
</Period>
</MPD>

后续步骤

了解如何完成特定的 Video Stitcher API 任务