準備用戶端,以進行廣告連播放送重新導向

本指南說明如何開發用戶端應用程式,透過 Pod 放送 API 和資訊清單操控器載入 HLS 或 DASH 直播串流。

必要條件

繼續操作前,請務必備妥下列項目:

提出串流要求

使用者選取串流時,請執行下列操作:

  1. 對直播服務方法發出 POST 要求。詳情請參閱「方法: stream」。

  2. application/x-www-form-urlencodedapplication/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
    }
    
  3. 在 JSON 回應中找出串流工作階段 ID,並儲存其他資料以供後續步驟使用。

投票廣告中繼資料

如要輪詢廣告中繼資料,請按照下列步驟操作:

  1. 從串流註冊回應中讀取 metadata_url 值。

  2. 對端點發出 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
        },
        ...
      }
    }
    
  3. 儲存 tags 物件,以供後續步驟使用。

  4. 使用 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,請按照下列步驟操作:

  1. 使用 urn:google:dai:2018https://aomedia.org/emsg/ID3scheme_id_uri 篩選事件。
  2. message_data 欄位擷取位元組陣列。

    以下範例會將 emsg 資料解碼為 JSON:

    {
      "scheme_id_uri": "https://developer.apple.com/streaming/emsg-id3",
      "presentation_time": 27554,
      "timescale": 1000,
      "message_data": "ID3TXXXgoogle_1234567890123456789",
      ...
    }
    
  3. TXXXgoogle_{ad_event_ID} 格式篩選 ID3 標記:

    TXXXgoogle_1234567890123456789
    

顯示廣告事件資料

如要找出 TagSegment 物件,請按照下列步驟操作:

  1. 從「Poll ad metadata」(輪詢廣告中繼資料) 中擷取廣告中繼資料 tags 物件。tags 物件是 TagSegment 物件的陣列。

  2. 使用完整的廣告事件 ID 找出類型為 progressTagSegment 物件。

  3. 使用廣告事件 ID 的前 17 個字元,找出其他類型的 TagSegment 物件。

  4. 取得 TagSegment 後,請使用 ad_break_id 屬性做為鍵,在廣告中繼資料 ad_breaks 物件中尋找 AdBreak 物件。

    以下範例會尋找 AdBreak 物件:

    {
      "type":"mid",
      "duration":15,
      "ads":1
    }
    
  5. 使用 TagSegmentAdBreak 資料,顯示廣告插播中廣告位置的相關資訊。例如:Ad 1 of 3

傳送媒體驗證 Ping

針對每個廣告事件 (progress 類型除外),傳送媒體驗證 Ping。Google DAI 會捨棄 progress 事件,頻繁傳送這類事件可能會影響應用程式效能。

如要產生廣告事件的完整媒體驗證網址,請完成下列步驟:

  1. 從串流回應中,將完整廣告事件 ID 附加至 media_verification_url 值。

  2. 使用完整網址提出 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) 檢查所有廣告事件的歷史記錄。詳情請參閱「監控及排解直播問題」。