本指南說明如何開發用戶端應用程式,透過 Pod 放送 API 和資訊清單操控器載入 HLS 或 DASH 直播串流。
必要條件
繼續操作前,請務必備妥下列項目:
使用
Pod serving redirect
DAI 類型設定的直播活動自訂素材資源金鑰。如要取得這項金鑰,請按照下列步驟操作:使用 SOAP API 用戶端程式庫呼叫
LiveStreamEventService.createLiveStreamEvents
方法,並將LiveStreamEvent
物件和dynamicAdInsertionType
屬性設為POD_SERVING_REDIRECT
列舉值。如需所有用戶端程式庫,請參閱用戶端程式庫和程式碼範例。
判斷您的平台是否支援 Interactive Media Ads (IMA) SDK。建議使用 IMA SDK 提高收益。詳情請參閱「為 DAI 設定 IMA SDK」。
提出串流要求
使用者選取串流時,請執行下列操作:
對直播服務方法發出
POST
要求。詳情請參閱「方法: stream」。以
application/x-www-form-urlencoded
或application/json
格式傳遞廣告指定目標參數。這項要求會向 Google DAI 註冊串流工作階段。以下範例會發出串流要求:
表單編碼
const url = `https://dai.google.com/ssai/pods/api/v1/` + `network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/stream`; const params = new URLSearchParams({ cust_params: 'section=sports&page=golf,tennis' }).toString(); const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: params }); console.log(await response.json());
JSON 編碼
const url = `https://dai.google.com/ssai/pods/api/v1/` + `network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/stream`; const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ cust_params: { section: 'sports', page: 'golf,tennis' } }) }); console.log(await response.json());
如果成功,您會看到類似以下的輸出內容:
{ "stream_id": "8d2b2292-6356-4c0e-94be-cece01d2df2e:DLS", "media_verification_url": "https://dai.google.com/view/.../event/c14aZDWtQg-ZwQaEGl6bYA/media/", "metadata_url": "https://dai.google.com/linear/pods/hls/.../metadata", "session_update_url": "https://dai.google.com/linear/.../session", "polling_frequency": 10 }
在 JSON 回應中找出串流工作階段 ID,並儲存其他資料以供後續步驟使用。
投票廣告中繼資料
如要輪詢廣告中繼資料,請按照下列步驟操作:
從串流註冊回應中讀取
metadata_url
值。對端點發出
GET
要求。詳情請參閱「方法: metadata」。以下範例會擷取廣告中繼資料:
const response = await fetch(metadata_url); console.log(await response.json());
如果成功,您會收到目前和即將到來的廣告插播的 PodMetadata 回應:
{ "tags":{ "google_5555555555":{ "ad":"0000229834_ad1", "ad_break_id":"0000229834", "type":"firstquartile" }, "google_1234567890123456789":{ "ad":"0000229834_ad1", "ad_break_id":"0000229834", "type":"progress" }, ... }, "ads":{ "0000229834_ad1":{ "ad_break_id":"0000229834", "position":1, "duration":15, "clickthrough_url":"https://.../", ... }, ... }, "ad_breaks":{ "0000229834":{ "type":"mid", "duration":15, "ads":1 }, ... } }
儲存
tags
物件,以供後續步驟使用。使用
polling_frequency
值設定計時器,定期要求所有後續廣告插播的中繼資料。
將串流載入影片播放器
從註冊回應取得工作階段 ID 後,請將 ID 傳遞至資訊清單操控器,或建構資訊清單網址,將串流載入影片播放器。
如要傳遞工作階段 ID,請參閱資訊清單操控器說明文件。如果您要開發資訊清單操控器,請參閱直播的資訊清單操控器。
以下範例會組裝資訊清單網址:
https://<your_manifest_manipulator_url>/manifest.m3u8?DAI_stream_ID=SESSION_ID&network_code=NETWORK_CODE&DAI_custom_asset_key=CUSTOM_ASSET_KEY"
播放器準備就緒後,即可開始播放。
監聽廣告事件
檢查串流的容器格式是否支援時間碼中繼資料:
使用傳輸串流 (TS) 容器的 HLS 串流會使用時間碼 ID3 標記,攜帶時間碼中繼資料。詳情請參閱「關於使用 HTTP 即時串流 (HLS) 的通用媒體應用程式格式」。
DASH 串流會使用
EventStream
元素,在資訊清單中指定事件。如果片段包含酬載資料的事件訊息 (
emsg
) 方塊 (包括 ID3 標記),DASH 串流會使用InbandEventStream
元素。詳情請參閱「InbandEventStream」。DASH 和 HLS 等 CMAF 串流會使用包含 ID3 標記的
emsg
方塊。
如要從串流擷取 ID3 標記,請參閱影片播放器的指南。詳情請參閱處理時間碼中繼資料指南
如要從 ID3 代碼擷取廣告事件 ID,請按照下列步驟操作:
- 使用
urn:google:dai:2018
或https://aomedia.org/emsg/ID3
依scheme_id_uri
篩選事件。 從
message_data
欄位擷取位元組陣列。以下範例會將
emsg
資料解碼為 JSON:{ "scheme_id_uri": "https://developer.apple.com/streaming/emsg-id3", "presentation_time": 27554, "timescale": 1000, "message_data": "ID3TXXXgoogle_1234567890123456789", ... }
以
TXXXgoogle_{ad_event_ID}
格式篩選 ID3 標記:TXXXgoogle_1234567890123456789
顯示廣告事件資料
如要找出 TagSegment
物件,請按照下列步驟操作:
從「Poll ad metadata」(輪詢廣告中繼資料) 中擷取廣告中繼資料
tags
物件。tags
物件是TagSegment
物件的陣列。使用完整的廣告事件 ID 找出類型為
progress
的TagSegment
物件。使用廣告事件 ID 的前 17 個字元,找出其他類型的
TagSegment
物件。取得
TagSegment
後,請使用ad_break_id
屬性做為鍵,在廣告中繼資料ad_breaks
物件中尋找AdBreak
物件。以下範例會尋找
AdBreak
物件:{ "type":"mid", "duration":15, "ads":1 }
使用
TagSegment
和AdBreak
資料,顯示廣告插播中廣告位置的相關資訊。例如:Ad 1 of 3
。
傳送媒體驗證 Ping
針對每個廣告事件 (progress
類型除外),傳送媒體驗證 Ping。Google DAI 會捨棄 progress
事件,頻繁傳送這類事件可能會影響應用程式效能。
如要產生廣告事件的完整媒體驗證網址,請完成下列步驟:
從串流回應中,將完整廣告事件 ID 附加至
media_verification_url
值。使用完整網址提出
GET
要求:// media_verification_url: "https://dai.google.com/view/.../event/c14aZDWtQg-ZwQaEGl6bYA/media/" const completeUrl = `${media_verification_url}google_5555555555123456789`; const response = await fetch(completeUrl);
如果成功,您會收到
202
程式碼狀態回應。否則會收到404
錯誤碼。
您可以使用串流活動監控器 (SAM) 檢查所有廣告事件的歷史記錄。詳情請參閱「監控及排解直播問題」。