本指南介绍了 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_type
为 0x0C
,表示 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_data
为 eyJmb28iOiJiYXIifQ==
(即 {"foo":"bar"}
的 base64 表示法),Video Stitcher API 会将 [foo]
替换为 bar
,并向 https://example.com?key=bar
发出广告代码请求。
与 Google Ad Manager 的集成
对于 Google Ad Manager 集成工作流,SCTE35 消息可能包含可在广告代码中替换的特定值。请参阅支持的宏列表。
确保在实时配置中注册的 adTagUri
包含所选宏。
例如,如果 SCTE35 消息传递 %%SPLICE_INSERT_EVENT_ID%%
的值,请确保 adTagUri
上存在该宏,如以下示例所示:
AD_TAG_URI¯o=%%SPLICE_INSERT_EVENT_ID%%
当 Video Stitcher API 请求广告元数据且 splice_insert
SCTE35 消息将 splice_insert_event_id
设为 123
时,它会使用以下广告代码:
AD_TAG_URI¯o=123
HLS 广告标记
EXT-X-DATERANGE
HTTP Live Streaming 规范中指定了使用 #EXT-X-DATERANGE
:
- 具有
SCTE35-OUT
属性的#EXT-X-DATERANGE
标记表示广告插播的立即开始接合点。 - 具有
SCTE35-IN
属性的#EXT-X-DATERANGE
标记表示广告插播的即时结束接合点。 SCTE35-OUT
和SCTE35-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-DATERANGE
或EXT-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 Period
和 Ad 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 任务。