このガイドでは、連続広告配信 API とマニフェスト マニピュレータを使用して HLS または DASH ライブ ストリームを読み込むクライアント アプリケーションを開発する方法について説明します。
前提条件
続行する前に、次のものを用意する必要があります。
- Pod serving redirectDAI タイプで構成されたライブ配信イベントのカスタム アセットキー。このキーを取得するには、次の手順を行います。
- SOAP API クライアント ライブラリを使用して、 - LiveStreamEventオブジェクトと- dynamicAdInsertionTypeプロパティを- POD_SERVING_REDIRECT列挙値に設定して- LiveStreamEventService.createLiveStreamEventsメソッドを呼び出します。すべてのクライアント ライブラリについては、クライアント ライブラリとサンプルコードをご覧ください。
 
- Interactive Media Ads(IMA)SDK がプラットフォームで利用可能かどうかを確認します。収益を増やすには、IMA SDK を使用することをおすすめします。詳しくは、DAI 用の IMA SDK を設定するをご覧ください。 
ストリーム リクエストを行う
ユーザーがストリームを選択した場合は、次の操作を行います。
- ライブ配信サービス メソッドに - POSTリクエストを送信します。詳細については、メソッド: stream をご覧ください。
- 広告のターゲティング パラメータを - application/x-www-form-urlencodedまたは- application/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 }
- JSON レスポンスでストリーム セッション ID を見つけ、以降のステップで使用する他のデータを保存します。 
広告メタデータをポーリングする
広告メタデータをポーリングする手順は次のとおりです。
- ストリーム登録レスポンスから - metadata_url値を読み取ります。
- エンドポイントに - GETリクエストを行います。詳細については、メソッド: メタデータをご覧ください。- 次の例では、広告のメタデータを取得しています。 - 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 }, ... } }
- 後の手順で使用するため、 - tagsオブジェクトを保存します。
- polling_frequency値を使用してタイマーを設定し、後続のすべての広告ブレークのメタデータを定期的にリクエストします。
動画プレーヤーにストリームを読み込む
登録レスポンスからセッション ID を取得したら、マニフェスト マニピュレータに ID を渡すか、マニフェスト URL を作成して動画プレーヤーにストリームを読み込みます。
セッション ID を渡すには、マニフェスト マニピュレータのドキュメントをご覧ください。マニフェスト マニピュレータを開発する場合は、ライブ配信用のマニフェスト マニピュレータをご覧ください。
次の例では、マニフェスト URL を組み立てています。
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 Live Streaming(HLS)での Common Media Application Format についてをご覧ください。 
- DASH ストリームは、 - EventStream要素を使用してマニフェスト内のイベントを指定します。
- セグメントに ID3 タグなどのペイロード データ用のイベント メッセージ( - emsg)ボックスが含まれている場合、DASH ストリームは- InbandEventStream要素を使用します。詳しくは、InbandEventStream をご覧ください。
- DASH や HLS などの CMAF ストリームは、ID3 タグを含む - emsgボックスを使用します。
ストリームから ID3 タグを取得するには、動画プレーヤーのガイドを参照してください。詳しくは、タイムド メタデータの処理ガイドをご覧ください。
ID3 タグから広告イベント ID を取得する手順は次のとおりです。
- urn:google:dai:2018または- https://aomedia.org/emsg/ID3を使用して、- scheme_id_uriでイベントをフィルタします。
- message_dataフィールドからバイト配列を抽出します。- 次の例では、 - emsgデータを JSON にデコードします。- { "scheme_id_uri": "https://developer.apple.com/streaming/emsg-id3", "presentation_time": 27554, "timescale": 1000, "message_data": "ID3TXXXgoogle_1234567890123456789", ... }
- 形式 - TXXXgoogle_{ad_event_ID}で ID3 タグをフィルタします。- TXXXgoogle_1234567890123456789
広告イベントデータを表示する
TagSegment オブジェクトを見つけるには、次の操作を行います。
- 広告メタデータをポーリングするから広告メタデータ - tagsオブジェクトを取得します。- tagsオブジェクトは- TagSegmentオブジェクトの配列です。
- 完全な広告イベント ID を使用して、タイプ - progressの- TagSegmentオブジェクトを見つけます。
- 広告イベント ID の最初の 17 文字を使用して、他のタイプの - TagSegmentオブジェクトを見つけます。
- TagSegmentを取得したら、- ad_break_idプロパティをキーとして使用して、広告メタデータの- ad_breaksオブジェクトで- AdBreakオブジェクトを見つけます。- 次の例では、 - AdBreakオブジェクトを検索します。- { "type":"mid", "duration":15, "ads":1 }
- TagSegmentと- AdBreakのデータを使用して、広告ブレーク内の広告の位置に関する情報を表示します。例:- Ad 1 of 3
メディア確認 ping を送信
progress タイプを除くすべての広告イベントで、メディア ベリフィケーション ping を送信します。Google DAI は progress イベントを破棄します。これらのイベントを頻繁に送信すると、アプリのパフォーマンスに影響する可能性があります。
広告イベントの完全なメディア検証 URL を生成する手順は次のとおりです。
- ストリーム レスポンスから、完全な広告イベント ID を - media_verification_url値に追加します。
- 完全な URL を使用して - 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)を使用すると、すべての広告イベントの履歴ログを確認できます。詳しくは、ライブ配信のモニタリングとトラブルシューティングをご覧ください。