このガイドでは、広告ポッド タイミング メタデータ(ATM)メソッドを使用して広告ブレークを挿入し、プリロール広告などの広告ブレークの正確なタイミングと再生時間を取得する方法について説明します。
プレロール広告を挿入し、ミッドロール広告ブレーク後にコンテンツに戻る処理を管理するには、次の API を呼び出すことをおすすめします。
- 連続配信広告のタイミング メタデータ(ATM)API: 広告とスレートの再生時間など、連続配信広告の判定結果をクエリします。
- 広告セグメント エンドポイント: 現在の広告ポッドを終了するオプションを使用して、広告またはスレート セグメントをリクエストします。
オプションとして、同時実行数の多いライブ配信イベントでは、Early Ad Break Notification(EABN)API を呼び出して、ミッドロール挿入点の開始前に広告判定をスケジュールすることをおすすめします。
前提条件
まず、Pod サービング リダイレクトのダイナミック広告挿入(DAI)タイプでライブ配信イベントを設定する必要があります。次のいずれかを行います。
- アド マネージャーの管理画面: DAI のライブ配信を設定します。
- Ad Manager API: クライアント ライブラリ(利用可能なオプション)を使用して、
LiveStreamEventService.createLiveStreamEventsメソッドを呼び出します。LiveStreamEvent.dynamicAdInsertionTypeパラメータをPOD_SERVING_REDIRECTに設定します。
コンテンツ ストリームを取得する
ユーザーがライブ配信イベントを選択すると、クライアント アプリは 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 を保存して、広告ステッチに備えます。
連続配信広告のタイミング メタデータを取得する
連続配信広告のタイミングを取得する手順は次のとおりです。
- HMAC トークンを生成する。
- HMAC トークンを使用して ATM API を呼び出します。
プレロール広告のリクエスト タイミング メタデータ
次のオプションを使用して、ライブ配信イベントのプリロール設定を確認します。
プレロール広告の決定結果を取得するには、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:17.450
#EXTINF:5.000,
contentorigin.com/3.ts
#EXTINF:5.000,
contentorigin.com/4.ts
#EXTINF:5.000,
contentorigin.com/5.ts
#EXTINF:2.450,
contentorigin.com/6.ts
#EXT-X-CUE-IN
#EXTINF:5.000,
contentorigin.com/7.ts
#EXTINF:5.000,
contentorigin.com/8.ts
次の例は、置き換えられたマニフェストを示しています。
#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/7.ts
#EXTINF:5.000,
contentorigin.com/8.ts
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 に sd= パラメータを追加する必要があります。このパラメータは、クライアントの動画プレーヤーのタイムラインに影響を与えないようにセグメントを短縮します。
次の例では、プリロール広告セグメントの 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.000,
contentorigin.com/1.ts
#EXTINF:5.000,
contentorigin.com/2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
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.000,
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.000,
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
#EXTINF:2.450,
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/3.ts?stream_id=SESSION_ID&sd=2450
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
contentorigin.com/7.ts
#EXTINF:5.000,
contentorigin.com/8.ts
スレート セグメントを作成する
広告とコンテンツの間のギャップを埋めるには、スレート セグメントを挿入します。ATM API の JSON レスポンスの slates.segment_durations.values 配列を使用して、各スレート セグメントの長さを決定します。必要に応じてセグメントの再生時間をループして、ミッドロール挿入点全体を埋めます。
広告ポッドが完了する前にコンテンツに戻る場合(EXT-X-CUE-IN タグを検出した場合など)は、最終スレート セグメントの URL に sd= パラメータを追加します。このパラメータは、クライアント動画プレーヤーのタイムラインに影響しないようにセグメントを短縮します。sd= パラメータの値は、セグメントを短縮する期間をミリ秒単位で表す整数である必要があります。
次の例では、スレート セグメントを組み立てています。
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 のままにするかを判断します。
コンテンツへの戻りを管理する
マニフェスト マニピュレータが広告ポッドのすべてのセグメントを挿入したら、マニフェスト マニピュレータはコンテンツ ストリームに戻る必要があります。コンテンツ ストリームに戻るには、次のいずれかの方法を選択します。各メソッドでは、ストリームのタイムラインを正確に保つために、最終的な再調整セグメントが必要です。
フィルと再調整: スレート セグメントを挿入し、スレートをループします。期間を入力し、各スレートのイテレーションの間に EXT-X-DISCONTINUITY 要素を挿入します。最後のセグメントでは、コンテンツの開始に合わせて sd= パラメータをミリ秒単位で追加します。
即時復帰: sd= パラメータを使用して単一の再調整スレート セグメントを挿入し、コンテンツを続けます。
動画プレーヤーは、タイムラインを変更せずにコンテンツに戻ります。
次の例では、ミッドロール挿入点の残りの時間をスレート セグメントで埋めることでトランジションを作成します。
#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-DISCONTINUITY
#EXTINF:5.000,
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.000,
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.000,
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
#EXT-X-DISCONTINUITY
#EXTINF:2.450,
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/1.ts?stream_id=SESSION_ID&sd=2450
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
contentorigin.com/7.ts
#EXTINF:5.000,
contentorigin.com/8.ts
このメソッドでは、マニフェスト マニピュレータが必要に応じてスレートをループし、sd= URL パラメータを最後のスレート セグメントにのみ追加します。このプロセスは、基盤となるコンテンツのスケジュールされた開始と正確に一致します。
次の例は、sd= パラメータで単一のスレート セグメントを使用して、ループ スレートで残りのブレーク全体を埋めない場合にプレーヤーのタイムラインを正確に保つ方法を示しています。
#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-DISCONTINUITY
#EXTINF:5.000,
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.000,
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.000,
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:2.450,
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&sd=2450
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
contentorigin.com/7.ts
#EXTINF:5.000,
contentorigin.com/8.ts
省略可: ミッドロール挿入点をスケジュール設定する
フィルレートを高めるには、広告ポッドの再生時間、カスタム ターゲティング パラメータ、SCTE-35 信号データを含む Early Ad Break Notification(EABN)を送信します。詳しくは、ミッドロール挿入点の早期通知を送信するをご覧ください。