広告ポッドのタイミング メタデータを含む広告を挿入する

このガイドでは、広告ポッドのタイミング メタデータ(ATM)メソッドを使用して広告ブレークを挿入し、プリロール広告などの広告ブレークの正確なタイミングと再生時間を取得する方法について説明します。

プレロール広告を挿入し、ミッドロール広告ブレーク後にコンテンツに戻る処理を管理するには、次の API を呼び出すことをおすすめします。

オプションとして、同時実行数の多いライブ配信イベントでは、Early Ad Break Notification(EABN)API を呼び出して、広告ブレークの開始前に広告判定をスケジュールすることをおすすめします。

前提条件

まず、Pod Serving リダイレクトのダイナミック広告挿入(DAI)タイプでライブ配信イベントを設定する必要があります。次のいずれかを行います。

コンテンツ ストリームを取得する

ユーザーがライブ配信イベントを選択すると、クライアント アプリは Google アド マネージャーにストリーム リクエストを行います。ストリーム レスポンスで、アプリは 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 を保存して、広告ステッチに備えます。

連続配信広告のタイミング メタデータを取得する

広告ポッドのタイミングを取得する手順は次のとおりです。

  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 アド マネージャー ネットワークのコード。詳しくは、アド マネージャーのアカウント情報を確認するをご覧ください。
    pd 必須 広告ブレークの再生時間(ミリ秒単位)。プレロール広告の場合、Google DAI はこのパラメータをライブ配信イベントの設定でオーバーライドします。
    scte35 省略可 Base64 でエンコードされた SCTE-35 信号。シグナルが正しいことを確認します。正しくない場合は、レスポンスの X-Ad-Manager-Dai-Warning HTTP ヘッダーにメッセージが送信され、シグナルは引き続き伝播されて広告ブレークが作成されます。サポートされている広告ブレーク マーカーについて詳しくは、HLS 統合をご覧ください。
  2. タイプが HMAC の Google DAI 認証キーをダウンロードします。詳しくは、DAI 動画ストリーム リクエストを認証するをご覧ください。

  3. ダウンロードした HMAC キーを使用して、トークン文字列の SHA256 署名を生成します。

  4. トークン文字列と生成された署名を連結します。

  5. 連結された文字列に URL エンコードを適用します。エンコードされた文字列は、広告ポッド タイミング メタデータ(ATM)API リクエストを認証するための署名付き HMAC トークンです。

次の例では、プレロール広告用の署名付き 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-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 を挿入して暗号化を元に戻します。

次の広告ブレークの開始時間、再生時間、インデックスを追跡します。

広告セグメントの URL を作成する

EXT-X-DISCONTINUITY タグの間のコンテンツ セグメントを、各広告セグメントの URL に置き換えます。挿入する広告セグメントの数を判断するには、ATM API からの JSON レスポンスで提供される ads.segment_durations.values を使用します。

EXT-X-CUE-IN タグが検出されたときに広告ポッドを早期に終了するには、最終広告セグメントの URL に d= パラメータを追加します。このパラメータは、クライアントの動画プレーヤーのタイムラインに影響しないようにセグメントを短縮します。

次の例では、プリロール広告セグメントの URL をマニフェストに組み立てています。広告セグメントはゼロから始まるインデックスを使用します。

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

次の例では、ミッドロール広告セグメントの URL をマニフェストに組み立てています。

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 のままにするかを判断します。

コンテンツへの戻りを管理する

広告ポッドからすべてのセグメントを挿入したら、次のいずれかの方法でコンテンツ ストリームに戻ります。

メソッド 説明 クライアントの動画プレーヤーへの影響
Fill with slate segments スレート セグメントを挿入し、スレートをループします。期間を埋め、各スレートのイテレーションの間に EXT-X-DISCONTINUITY 要素を挿入します。 効果なし。
動画プレーヤーは、タイムラインを変更せずにコンテンツに戻ります。
単一の Slate セグメントで再調整する 1 つのスレート セグメントを挿入します。d= パラメータを使用して、コンテンツが開始するまでの時間を入力します。 効果なし。
動画プレーヤーは、タイムラインを変更せずにコンテンツに戻ります。
Immediate Return コンテンツ セグメントを挿入します。 動画プレーヤーのタイムラインが変更されます。
クライアントの動画プレーヤーは、変更されたタイムラインを処理する必要があります。

省略可: 広告ブレークをスケジュールする

フィルレートを高めるには、広告ポッドの再生時間、カスタム ターゲティング パラメータ、SCTE-35 信号データを含む Early Ad Break Notification(EABN)を送信します。詳しくは、広告の早期挿入に関する通知を送信するをご覧ください。