ライブ配信用の SGAI を使ってみる

サーバーガイド付き広告挿入(SGAI)は、クライアント デバイスでのスティッチングに対応した連続配信広告マニフェストを提供します。Google アド マネージャー ネットワークで連続広告配信ダイナミック広告挿入を有効にしている場合は、SGAI を使用できます。連続広告配信ダイナミック広告挿入が有効になっていない場合は、アカウント マネージャーにお問い合わせください。

SGAI では、連続配信広告サービング API エンドポイントを使用して、ストリームを作成し、広告メタデータと連続配信広告マニフェストを取得します。

マニフェスト操作サーバーがある場合は、連続配信広告 マニフェスト URL を生成し、連続配信広告 マニフェスト情報を含む広告マーカーを、指定した仕様に従ってコンテンツ ストリームに挿入できます。

または、ストリーム マニフェストの広告マーカー以外のメカニズムを使用して、ミッドロール挿入点をスケジュールすることもできます。このような場合、アプリは、ストリーム、アプリ自体、プッシュ通知に対するユーザー インタラクションなど、他のイベントをリッスンできます。これらのイベントの後、アプリは連続配信広告マニフェスト URL を生成し、連続配信広告マニフェストの読み込みを開始するようプレーヤーに指示できます。

前提条件

続行する前に、次のものがあることを確認してください。

推奨事項に従う

連続配信広告マニフェスト URL を 生成する前に、Early Ad Break Notification(EABN)API を 呼び出して 、各ミッドロール挿入点の想定される期間、ターゲティング情報、その他の パラメータを指定することをおすすめします

広告ネットワークにプログラマティック キャンペーンがある場合は、本番環境とテスト ストリームで EABN API を呼び出します。詳しくは、 プログラマティック直接取引の機能とガイドラインをご覧ください。

ストリーム登録リクエストを作成する

ユーザーが動画プレーヤー アプリでコンテンツ ストリームを開始すると、ターゲティング パラメータを使用してストリーム登録リクエストを行い、アド マネージャーでストリーミング セッションを作成します。ストリーム登録リクエストの作成について詳しくは、 メソッド:streamをご覧ください。 その後、リクエストから レスポンス データ を受け取ります。

次の例では、ストリーム登録リクエストを作成します。

書式なしテキスト HTTP

  • リクエスト:
authority: dai.google.com
method: POST
path: /ssai/pods/api/v1/network/51636543/custom_asset/hls-podserving-manifest/stream
scheme: https
content-type: application/x-www-form-urlencoded

cust_params=customID%253D1543216789%2526anotherKey%253Dvalue1%252Cvalue2
  • 対応:
{
    "manifest_format": "hls",
    "media_verification_url": "https://dai.google.com/view/p/service/linear/stream/24fd4e7c-95a0-42be-8874-00625139b9db:TUL/loc/TUL/network/51636543/event/TFyZF0IoSpqvCLtLv8JdCw/media/",
    "metadata_url": "https://dai.google.com/linear/pods/hls/pa/event/TFyZF0IoSpqvCLtLv8JdCw/stream/24fd4e7c-95a0-42be-8874-00625139b9db:TUL/metadata",
    "polling_frequency": 10,
    "session_update_url": "https://dai.google.com/linear/v1/pa/event/TFyZF0IoSpqvCLtLv8JdCw/stream/24fd4e7c-95a0-42be-8874-00625139b9db:TUL/session",
    "stream_id": "24fd4e7c-95a0-42be-8874-00625139b9db:TUL"
}

Shell

  • コマンドライン:
curl \
-H "Host: dai.google.com" \
-H "content-type: application/x-www-form-urlencoded" \
  --data-binary "cust_params=channelID%253D1543216789%2526anotherKey%253Dvalue1%252Cvalue2" \
  --compressed "https://dai.google.com/ssai/pods/api/v1/network/51636543/custom_asset/hls-podserving-manifest/stream"
  • 出力:
{
    "manifest_format": "hls",
    "media_verification_url": "https://dai.google.com/view/p/service/linear/stream/24fd4e7c-95a0-42be-8874-00625139b9db:TUL/loc/TUL/network/51636543/event/TFyZF0IoSpqvCLtLv8JdCw/media/",
    "metadata_url": "https://dai.google.com/linear/pods/hls/pa/event/TFyZF0IoSpqvCLtLv8JdCw/stream/24fd4e7c-95a0-42be-8874-00625139b9db:TUL/metadata",
    "pod_manifest_url": "https://dai.google.com/linear/pods/v1/hls/event/TFyZF0IoSpqvCLtLv8JdCw/pod/$pod-id$.m3u8?stream_id=24fd4e7c-95a0-42be-8874-00625139b9db%3ATUL",
    "polling_frequency": 10,
    "session_update_url": "https://dai.google.com/linear/v1/pa/event/TFyZF0IoSpqvCLtLv8JdCw/stream/24fd4e7c-95a0-42be-8874-00625139b9db:TUL/session",
    "stream_id": "24fd4e7c-95a0-42be-8874-00625139b9db:TUL"
}

JavaScript

  • Fetch API を使用する場合:
const response = await fetch("https://dai.google.com/ssai/pods/api/v1/network/51636543/custom_asset/hls-podserving-manifest/stream", {
  "headers": {
    "content-type": "application/x-www-form-urlencoded",
  },
  "body": "cust_params=channelID%3D1543216789%26anotherKey%3Dvalue1%2Cvalue2",
  "method": "POST",
});

  const stream = await response.json();
  console.log(stream);
  • コンソールログ:
{
    "stream_id": "24fd4e7c-95a0-42be-8874-00625139b9db:TUL",
    "media_verification_url": "https://dai.google.com/view/p/service/linear/stream/24fd4e7c-95a0-42be-8874-00625139b9db:TUL/loc/TUL/network/51636543/event/TFyZF0IoSpqvCLtLv8JdCw/media/",
    "metadata_url": "https://dai.google.com/linear/pods/hls/pa/event/TFyZF0IoSpqvCLtLv8JdCw/stream/24fd4e7c-95a0-42be-8874-00625139b9db:TUL/metadata",
    "session_update_url": "https://dai.google.com/linear/v1/pa/event/TFyZF0IoSpqvCLtLv8JdCw/stream/24fd4e7c-95a0-42be-8874-00625139b9db:TUL/session",
    "polling_frequency": 10,
    "pod_manifest_url": "https://dai.google.com/linear/pods/v1/hls/event/TFyZF0IoSpqvCLtLv8JdCw/pod/$pod-id$.m3u8?stream_id=24fd4e7c-95a0-42be-8874-00625139b9db%3ATUL",
    "manifest_format": "hls"
}

ミッドロール挿入点のメタデータをポーリングする

ストリーム登録リクエストを作成したら、広告メタデータをポーリングします。ポーリングするには、登録ステップでストリーム レスポンスの polling_frequence を使用してタイマーを設定し、広告メタデータを呼び出します。ポーリングごとに、メタデータを含む広告の部分的なリストが利用可能になると、そのリストを受け取ることができます。

連続配信広告マニフェスト URL を生成する

連続広告配信 API の ポッドリソース の URL を作成します。その後、URL を動画プレーヤーに渡して、連続配信広告の読み込みを開始します。

次の例は、連続配信広告マニフェスト URL の構造を示しています。

https://dai.google.com/linear/pods/v1/hls/network/51636543/custom_asset/pod_serving_hls_manifest_mp4/ad_break_id/ab101.m3u8?stream_id=24fd4e7c-95a0-42be-8874-00625139b9db:TUL&pd=120000

連続配信広告マニフェスト URL パラメータは、動画プレーヤーまたはサーバー通知から取得したミッドロール挿入点情報に基づいて計算できます。これらのパラメータの要件については、 メソッド: ポッド マニフェストをご覧ください。

連続配信広告マニフェストを再生する

クライアントの動画プレーヤー アプリで、メインの動画プレーヤーを使用してコンテンツ ストリームの再生を開始します。必要に応じて、再生と広告スケジュールを監視する方法について、動画プレーヤーのドキュメントをご覧ください。

連続配信広告マニフェスト URL を生成してサーバー側のマニフェストに挿入する場合は、動画プレーヤーの今後のミッドロール挿入点イベントを監視し、各ミッドロール挿入点の再生中に id3 イベントを登録してください。クライアント側から広告ブレーク イベントをスケジュールする場合は、作成時に id3 イベントを登録します。

インプレッションと広告イベントをレポートする

動画プレーヤーが連続配信広告を再生し、id3 タイミング メタデータが検出されたら、 動画プレーヤーがトリガーする広告イベントをリッスンし 、それらを処理して メディア検証 ping を送信します