本指南說明如何使用廣告連播時間中繼資料 (ATM) 方法插入廣告插播,以擷取廣告插播的確切時間和長度,包括片頭廣告。
如要插入片頭廣告,並在片中廣告插播後管理內容的返回作業,建議呼叫下列 API:
- 廣告連播時間中繼資料 (ATM) API: 查詢廣告連播決策結果,包括廣告和字卡時間長度。
- 廣告片段端點: 要求廣告或字卡片段,並可選擇終止目前的廣告連播。
(選用) 如果是高並行直播活動,建議您在廣告插播開始前呼叫 Early Ad Break Notification (EABN) API,排定廣告決策。
必要條件
如要開始使用,您需要為廣告連播放送重新導向動態廣告插播 (DAI) 類型設定直播活動。選擇下列其中一種方法:
- Ad Manager 使用者介面: 設定 DAI 的直播。
- Ad Manager API:使用用戶端程式庫 (可用選項) 呼叫
LiveStreamEventService.createLiveStreamEvents方法。將LiveStreamEvent.dynamicAdInsertionType參數設為POD_SERVING_REDIRECT。
擷取內容串流
使用者選取直播活動時,用戶端應用程式會向 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,以便準備縫合廣告。
擷取廣告連播時間中繼資料
如要擷取廣告連播時間碼,請按照下列步驟操作:
- 產生 HMAC 權杖。
- 使用 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"
要求片中廣告的時間中繼資料
如要擷取中途廣告連播的廣告連播中繼資料,請按照下列步驟操作:
- 剖析直播資訊清單,找出含有各片中廣告插播時間點時間和長度的廣告標記。
- 呼叫 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-IN 和 EXT-X-CUE-OUT 標記,指出廣告插播的開始和結束時間。
將 EXT-X-CUE-IN 和 EXT-X-CUE-OUT 標記替換為 EXT-X-DISCONTINUITY 元素,讓用戶端影片播放器在內容和廣告之間切換。
下列資訊清單範例會取代 EXT-X-CUE-IN 和 EXT-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= 參數。這個參數會縮短片段,避免影響用戶端影片播放器的時間軸。
以下範例會將片頭廣告片段網址組裝至資訊清單。請注意,廣告片段使用以零為基礎的索引:
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。
管理返回內容的動作
資訊清單操控器插入廣告連播中的所有片段後,必須返回內容串流。如要返回內容串流,請選擇下列其中一種做法。每種方法都需要最終重新對齊的區隔,才能確保串流時間軸的準確度。
填入並重新對齊:插入板岩片段並環繞板岩。
填入持續時間,並在每次迭代之間插入 EXT-X-DISCONTINUITY 元素。如果是最後一個區段,請附加 d= 參數 (以毫秒為單位),與內容開始時間相符。
立即回歸:使用 d= 參數插入單一重新對齊的 Slate 片段,然後接續內容。
影片播放器會返回內容,時間軸不會改變。
以下範例會填入廣告插播時間長度的剩餘時間,建立轉場效果。
#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= URL 參數附加至最後一個板岩區段。這項程序會與基礎內容的預定開始時間完全一致。
以下範例說明如何使用 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
選用:排定廣告插播時間
如要提高供應率,請傳送 Early Ad Break Notification (EABN),並提供廣告連播時間長度、自訂指定目標參數和 SCTE-35 信號資料。詳情請參閱「提早傳送廣告插播通知」。