本指南說明如何使用廣告連播時間中繼資料 (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 動態廣告插播工作階段 ID 和 CUSTOM_ASSET_KEY,以便準備縫合廣告。
擷取廣告插播時間中繼資料
如要擷取廣告插播時間碼,請按照下列步驟操作:
- 產生 HMAC 權杖。
- 使用 HMAC 權杖呼叫 ATM API。
產生已簽署的 HMAC 權杖
如要驗證要求,請按照下列步驟操作:
依字母順序串連下列參數,並以半形波浪號
~
分隔,即可建立權杖字串:參數 必填或選填 說明 ad_break_id
必填 您指定的字串,用於識別廣告插播時間,例如 ad-break-1
。片頭廣告請使用preroll
。custom_asset_key
必填 直播活動的自訂素材資源金鑰。 cust_params
選用 自訂指定目標參數。詳情請參閱「為串流提供指定目標參數」一文。 exp
必填 這個權杖的到期時間,以自 Unix 紀元起經過的總秒數計算。 network_code
必填 您的 Google Ad Manager 聯播網代碼。詳情請參閱「尋找 Ad Manager 帳戶資訊」。 pd
必填 廣告插播時間長度 (以毫秒為單位)。如果是片頭廣告,Google DAI 會以直播活動設定覆寫這個參數。 scte35
選用 Base64 編碼的 SCTE-35 信號。確認訊號正確無誤。如果錯誤,系統會在回應中將訊息傳送至 X-Ad-Manager-Dai-Warning
HTTP 標頭,且信號仍會傳播以建立廣告插播。如要進一步瞭解支援的廣告插播標記,請參閱「HLS 整合」。下載 HMAC 類型的 Google 動態廣告插播驗證金鑰。詳情請參閱「驗證 DAI 影片串流請求」。
使用下載的 HMAC 金鑰,產生權杖字串的 SHA256 簽名。
串連權杖字串和產生的簽章。
對串連的字串套用網址編碼。編碼字串是已簽署的 HMAC 權杖,用於驗證 Ad Pod 時間中繼資料 (ATM) API 要求。
以下範例會產生前置片頭廣告的已簽署 HMAC 權杖:
custom_asset_key="CUSTOM_ASSET_KEY"
exp="1750700000" # Expired on Mon Jun 23 2025 13:33:20 GMT-0400 (Eastern Daylight Time)
network_code="NETWORK_CODE"
ad_break_id="preroll"
pd="0" # Pod duration value is overridden by the livestream event settings.
# The HMAC authentication key associated with your livestream event in Google Ad Manager.
secret_key="24E96382584C328087546B0E8454F26158564E8466FD2BE3D8A996B38445876C"
# Concatenate the parameters, keep the parameters alphabetically ordered by name.
token_string="ad_break_id=${ad_break_id}~custom_asset_key=${custom_asset_key}~exp=${exp}~network_code=${network_code}~pd=${pd}"
# Calculate the SHA256 signature of the token_string.
hmac_signature=$(echo -n "$token_string" | openssl dgst -sha256 -hmac "$secret_key" | awk '{print $2}')
# Concatenate the token string and the signature.
signed_token="${token_string}~hmac=${hmac_signature}"
url_encode() {
local string="${1}"
local strlen=${#string}
local encoded=""
local pos c
for (( pos=0 ; pos<strlen ; pos++ )); do
c=${string:$pos:1}
case "$c" in
[-_.~a-zA-Z0-9] ) o="${c}" ;;
* ) printf -v o '%%%02x' "'$c"
esac
encoded+="${o}"
done
echo "${encoded}"
}
# Apply URL encoding to the concatenated string.
url_encoded_signed_token=$(url_encode "$signed_token")
echo "Signed HMAC token:"
echo "${url_encoded_signed_token}"
# Example output:
# ad_break_id%3Dpreroll~custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~exp%3D1489680000~network_code%3D21775744923~pd%3D180000~pod_id%3D5~hmac%3D24E96382584C328087546B0E8454F26158564E8466FD2BE3D8A996B38445876C
片頭廣告的要求時間中繼資料
使用下列選項,驗證直播活動的片頭廣告設定:
如要擷取片頭廣告決策結果,請向 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
開始,並在每個循環的 slate 中遞增這個數字,或是將所有疊代都設為 0
。
管理返回內容的動作
插入廣告連播中的所有片段後,請選擇下列其中一種方法,返回內容串流:
方法 | 說明 | 對用戶端影片播放器的影響 |
---|---|---|
填入插入畫面片段 | 插入場記板片段並循環播放。填入時間長度,並在每次迭代之間插入 EXT-X-DISCONTINUITY 元素。 |
無效果。 影片播放器會返回內容,時間軸不會改變。 |
使用單一平板電腦區隔重新對齊 | 插入單一 Slate 片段。使用 d= 參數填入內容開始前的時間長度。 |
無效果。 影片播放器會返回內容,時間軸不會改變。 |
立即退貨 | 插入內容片段。 | 影片播放器的時間軸會改變。 用戶端影片播放器必須處理改變的時間軸。 |
選用:排定廣告插播時間
如要提高填充率,請傳送 Early Ad Break Notification (EABN),並提供廣告插播時間長度、自訂指定目標參數和 SCTE-35 信號資料。詳情請參閱提早傳送廣告插播通知。