廣告標記

本指南說明 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 時,您可以在第一個區隔專屬節目 ID (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_insert SCTE35 訊息的 splice_insert_event_id 設為 123 時,會使用以下廣告代碼:

AD_TAG_URI&macro=123

HLS 廣告標記

EXT-X-DATERANGE

HTTP 即時串流規格中已指定使用 #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-DATERANGE 標記只會套用至變異播放清單中的下一個區段,即使 START-DATE 與區段的時間戳記不符也不例外。

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 資訊清單中,廣告插播應由 Period 代表,並搭配含有 cue-out 標記的事件串流。由於廣告插播期結束即表示廣告插播結束,因此不需要 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 提示結束標記插入來源資訊清單。標記的 X-TYPE 屬性會指出廣告標記的類型;如果是提前廣告插播通知,X-TYPE 的值應為 EABN。標記的 START-TIME 屬性會指出實際或預定的廣告插播時間。標記的 DURATION 屬性是必要屬性,用於指出廣告插播的時間長度。這個標記稱為 EABN 提示音

在廣告插播的實際開始時間點,來源編碼器必須在來源資訊清單中插入 #EXT-X-DATERANGE 提示結束標記。標記的 ID 屬性必須與對應的 EABN 提示音相同。標記的 START-TIME 必須與插入此標記的片段媒體時間相同。這個標記稱為「立即提示」

以下資訊清單範例包含一個 EABN 提示結束、一個立即提示結束和一個提示開始:

#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 提示結束標記。標記的 X-TYPE 屬性會指出廣告標記的類型;如果是提前廣告插播通知,X-TYPE 的值應為 EABN。標記的 DURATION 屬性必須指出廣告插播的時間長度。這個標記稱為 EABN 提示音

在廣告插播的實際開始時間點,來源編碼器必須在來源資訊清單中插入 #EXT-X-CUE-OUT 提示結束標記。標記的 ID 屬性必須與對應的 EABN 提示音相同。這個標記稱為「立即提示結束」

以下範例資訊清單包含一個 EABN 提示結束、一個立即提示結束和一個提示開始:

#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 工作