插入廣告,並提供廣告插播時間中繼資料

本指南說明如何使用廣告連播時間中繼資料 (ATM) 方法插入廣告插播,以擷取廣告插播的精確時間和長度,包括片頭廣告。

如要插入片頭廣告,並在片中廣告插播後管理內容的返回作業,建議呼叫下列 API:

如為高並行直播活動,建議您呼叫 Early Ad Break Notification (EABN) API,在廣告插播開始前排定廣告決策。

必要條件

如要開始使用,您需要為廣告連播放送重新導向動態廣告插播 (DAI) 類型設定直播活動。選擇下列其中一種方法:

擷取內容串流

使用者選取直播活動時,用戶端應用程式會向 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,以便準備縫合廣告。

擷取廣告插播時間中繼資料

如要擷取廣告插播時間碼,請按照下列步驟操作:

  1. 產生 HMAC 權杖。
  2. 使用 HMAC 權杖呼叫 ATM API。

產生已簽署的 HMAC 權杖

如要驗證要求,請按照下列步驟操作:

  1. 依字母順序串連下列參數,並以半形波浪號 ~ 分隔,即可建立權杖字串:

    參數 必填或選填 說明
    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 整合」。
  2. 下載 HMAC 類型的 Google 動態廣告插播驗證金鑰。詳情請參閱「驗證 DAI 影片串流請求」。

  3. 使用下載的 HMAC 金鑰,產生權杖字串的 SHA256 簽名。

  4. 串連權杖字串和產生的簽章。

  5. 對串連的字串套用網址編碼。編碼字串是已簽署的 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"

要求片中廣告的時間中繼資料

如要擷取中途廣告插播的廣告插播中繼資料,請按照下列步驟操作:

  1. 剖析直播資訊清單,找出含有各片中廣告時段時間和長度的廣告標記。
  2. 呼叫 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-INEXT-X-CUE-OUT 標記,指出廣告插播的開始和結束時間。

EXT-X-CUE-INEXT-X-CUE-OUT 標記替換為 EXT-X-DISCONTINUITY 元素,讓用戶端影片播放器在內容和廣告之間切換。

下列資訊清單範例會取代 EXT-X-CUE-INEXT-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 信號資料。詳情請參閱提早傳送廣告插播通知