本指南說明如何使用廣告連播時間中繼資料 (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:15.000
#EXTINF:5.000,
contentorigin.com/3.ts
#EXTINF:5.000,
contentorigin.com/4.ts
#EXTINF:5.000,
contentorigin.com/5.ts
#EXT-X-CUE-IN
#EXTINF:5.000,
contentorigin.com/6.ts
#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/6.mp4
#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.00,
contentorigin.com/1.ts
#EXTINF:5.00,
contentorigin.com/2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.00,
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.00,
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.00,
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:5.00,
contentorigin.com/6.mp4
#EXTINF:5.00,
contentorigin.com/7.mp4
#EXTINF:5.00,
contentorigin.com/8.mp4
建立插入畫面片段
如要填補廣告和內容之間的空白,請插入字卡片段。
使用 ATM API 的 JSON 回應中的 slates.segment_durations.values 陣列,判斷每個字卡片段的持續時間。視需要循環播放片段時間長度序列,填滿整個廣告插播時間。
以下範例會組裝字卡區隔:
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= 參數填入內容開始前的時間長度。 |
無效果。 影片播放器會返回內容,時間軸不會改變。 |
| 立即退貨 | 插入內容片段。 | 影片播放器的時間軸已變更。 用戶端影片播放器必須處理變更後的時間軸。 |
選用:排定廣告插播時間
如要提高供應率,請傳送 Early Ad Break Notification (EABN),並提供廣告連播時間長度、自訂指定目標參數和 SCTE-35 信號資料。詳情請參閱「提早傳送廣告插播通知」。