ライブ ストリーム用のマニフェスト マニピュレータ

Pod Serving API を使用すると、エンコードおよび条件付けされた広告セグメントにアクセスできます。広告セグメントは、ユーザー向けの HLS または MPEG-DASH メディア再生リストに直接合成できる形で準備されます。MPEG-DASH の場合、Pod Serving API には、これらの広告セグメントに関する追加情報とコンテキストを提供するマニフェスト テンプレートも用意されています。

このガイドでは、ライブ ストリーム用の基本的な Pod Serving マニフェスト操作サーバーの実装に焦点を当てます。

前提条件: Google アド マネージャーでライブ ストリーム イベントを設定する

Pod Serving API からリクエストを行う前に、処理するストリームごとにアド マネージャーのライブ ストリーム イベントを作成する必要があります。ライブ ストリーム イベントを作成するには、LiveStreamEventService API または Google アド マネージャーの管理画面を使用します。

ライブストリーム イベントを Pod Serving API で使用するには、イベントのいくつかの属性を入力する必要があります。

  • customAssetKey - このイベントに使用されるカスタム識別子。ネットワークのすべてのイベントで一意である必要があります。
  • adTags - アド マネージャーの入稿ワークフローで生成されるメインの広告タグ URL。
  • dynamicAdInsertionType - POD_SERVING_REDIRECT に設定する必要があります。
  • streamingFormat - 状況に応じて HLS または DASH に設定します。
  • segmentUrlAuthenticationKeyIds - 広告セグメント リクエストの署名に使用される 1 つ以上の HMAC キー
  • daiEncodingProfileIds - このイベントに対して有効になっている DAIEncodingProfile ID のリスト。
  • startDateTime - イベントの開始日時
  • endDateTime - このイベントの終了予定日時。unlimitedEndDateTimeis false and ignored ifunlimitedEndDateTimeis true.unlimitedEndDateTime - ブール値の場合、この属性は必須です。上述の説明をご参照ください。

ストリーム マニフェスト リクエストを受信する

マニフェスト マニピュレータでは、動画プレーヤー クライアント アプリからのマニフェスト リクエストをリッスンする API エンドポイントを指定する必要があります。少なくとも、このエンドポイントはクライアント プレーヤー アプリからストリーム ID を収集し、合成されたストリーム マニフェストを返す必要があります。ストリーム ID は、アド マネージャーに対してストリーミング セッションを識別するために使用されます。

適切なコンテンツ ストリームを特定するために、コンテンツ ID などの他の情報を収集する必要もあります。

マニフェスト リクエスト エンドポイントの例

GET /api/video/{asset_key}/manifest.{format}
Host: {your_domain}
パスパラメータ
asset_key システムでリクエストされたライブ配信に対応する仮の ID。
format ストリーム形式に対応する仮想パラメータ。次のいずれかです。
mpd MPEG-DASH ストリームの場合
m3u8 HLS ストリームの場合
クエリ パラメータ
stream_id クライアント動画プレーヤー アプリのアド マネージャー ストリーム ID。

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

マニフェスト リクエストから収集したコンテンツ ID を使用して、広告と組み合わせるコンテンツ ストリームを選択します。

広告セグメントをコンテンツ ストリームに合成

広告セグメント URL の合成方法は、ストリーム形式によって異なります。

HLS ストリーム

HLS ストリームは通常、マルチバリアント マニフェストとして提供されます。これには、各エンコード プロファイルに対応するバリアント マニフェストへのリンクのセットが含まれます。

注: 説明をわかりやすくするため、このガイドでは HLS メディアが、音声と動画を同じセグメント ファイルに多重化する形式でエンコードされていることを前提としています。

プロキシ マルチバリアント プレイリスト

プレーヤーが選択したバリアント マニフェストを処理するために、元のマルチバリアント プレイリストの各バリアント プレイリストの URL を、マニピュレータに対する別のエンドポイント呼び出しに置き換える必要があります。

HLS を結合する残りの手順では、単一のバリアント マニフェストが処理されていることを前提としています。

バリアント リクエストのエンドポイントの例
GET /api/video/{asset_key}/variant/{variant_id}.m3u8
Host: {your_domain}
パスパラメータ
asset_key システムでリクエストされたライブ配信に対応する仮の ID。
variant 処理される特定のバリアントの識別子を含む仮のパラメータ。
クエリ パラメータ
stream_id クライアント動画プレーヤー アプリのアド マネージャー ストリーム ID。マニフェスト マニピュレータでユーザー セッションを識別するためにここで使用されます。
未処理のマルチバリアント マニフェストの例
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://cdn.{...}/1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720,CODECS="avc1.4d000c,mp4a.40.5"
https://cdn.{...}/720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://cdn.{...}/360p.m3u8
プロキシされたマルチバリアント マニフェストの例
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://{manifest_manipulator}/api/video/tears_of_steel/variant/1080p.m3u8?stream_id=6e69425c-0ac5-43ef-b070-c5143ba68541:CHS
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720,CODECS="avc1.4d000c,mp4a.40.5"
https://{manifest_manipulator}/api/video/tears_of_steel/variant/720p.m3u8?stream_id=6e69425c-0ac5-43ef-b070-c5143ba68541:CHS
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://{manifest_manipulator}/api/video/tears_of_steel/variant/360p.m3u8?stream_id=6e69425c-0ac5-43ef-b070-c5143ba68541:CHS

ミッドロール挿入点のセグメントを特定して、不連続点を挿入する

バリアント マニフェストを処理する際、処理される動的マニフェストに広告コンテンツに置き換えられるセグメントが含まれるまで、次の広告ブレークの開始時間、継続時間、インデックスを追跡します。

ミッドロール挿入点とコンテンツ セグメントを区別する方法は、エンコーダによって異なります。ミッドロール挿入点を区切る一般的な方法の一つは、広告セグメントの前に #EXT-X-CUE-OUT タグ、その後に #EXT-X-CUE-IN タグを付けることです。

Google がホストするミッドロール挿入点とコンテンツ セグメントを区別するには、各ミッドロール挿入点の先頭と末尾に #EXT-X-DISCONTINUITY タグを挿入する必要があります。これらの中断タグが最終的なマニフェストに含まれない場合、再生は失敗します。

挿入された広告セグメント URI が暗号化されていません。コンテンツが暗号化されている場合は、各ミッドロール挿入点の最初の広告セグメントの前に #EXT-X-KEY:METHOD=NONE を指定して暗号化を解除し、ミッドロール挿入点の後に再度追加する必要があります。

サンプル マニフェスト(オリジナル)
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0

#EXTINF:5.005,
contentorigin.com/1.ts
#EXTINF:5.005,
contentorigin.com/2.ts
#EXT-X-CUE-OUT:15.000
#EXTINF:5.005,
contentorigin.com/3.ts
#EXTINF:5.005,
contentorigin.com/4.ts
#EXTINF:5.005,
contentorigin.com/5.ts
#EXTINF:5.000,d
contentorigin.com/6.ts
#EXT-X-CUE-IN
#EXTINF:5.005,
contentorigin.com/7.mp4
#EXTINF:5.005,
contentorigin.com/8.mp4
不連続性が挿入されたマニフェスト
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0

#EXTINF:5.005,
contentorigin.com/1.ts
#EXTINF:5.005,
contentorigin.com/2.ts
#EXTINF:5.005,
#EXT-X-DISCONTINUITY
{... New segments will go here ...}
#EXT-X-DISCONTINUITY
#EXTINF:5.005,
contentorigin.com/7.mp4
#EXTINF:5.005,
contentorigin.com/8.mp4

連続配信広告のセグメントを処理する

連続配信広告内のセグメントごとに、いくつかの追加の値をトラッキングする必要があります。

  • segment_number: 連続配信広告内のセグメント インデックス。0 から始まります。mp4 初期化セグメントの場合は「init」を指定します。
  • segment_duration: 現在のセグメントの再生時間(ミリ秒単位)。この値は、Pod 内の最後のセグメントを除くすべてのセグメントで同じにする必要があります。
  • segment_offset: 前のセグメントの長さをセグメント オフセットに加算して計算されるセグメント オフセット(ミリ秒単位)
  • last: 連続配信広告の最後のセグメントを識別するブール値。デフォルトは false です。

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

ミッドロール挿入点内の各セグメントを次の形式の URL に置き換えます。

/linear/pods/v1/seg/network/{network_code}/custom_asset/{custom_asset_key}/pod/{pod_id}/profile/{profile_name}/{segment_number}.(ts|mp4|vtt|aac|ac3|eac3)
パスパラメータ
network_code このネットワークのアド マネージャー 360 ネットワーク コード。
custom_asset_key LiveStreamEventService API またはアド マネージャー 360 管理画面のライブ配信ページで指定されたカスタム ライブ配信アセットキー。
pod_id ミッドロール挿入点の識別子。1 から始まり、ミッドロール挿入点ごとに 1 ずつ増加する整数を指定する必要があります。

この値は、現在のイベントで同じミッドロール挿入点を表示するすべてのユーザーで同じにする必要があります。

profile_name リクエストされているプロファイルの識別子。
segment_number 現在の連続配信広告内のこのセグメントのインデックス(ゼロから始まる)。
MP4 コンテナを使用している場合は、segment_number を「init」に設定することで初期化セグメントをリクエストできます。
クエリ パラメータ
stream_id 必須 Stream Create リクエストから返されたユーザーの stream_id パラメータ。
sd 必須 segment_duration
so 省略可 segment_offset

so がない場合、前のセグメントはすべて同じ継続時間であると想定され、セグメント オフセットは segment_numbersd から計算されます。

pd 必須(時間指定なしのミッドロール挿入点が有効になっているイベントを除く) 広告ブレークの再生時間(ミリ秒単位)。ad_pod_duration と参照されることもあります。
auth-token 必須 この連続配信広告用の署名付き URL エンコードされた HMAC トークン
last 省略可 ミッドロール挿入点の最後のセグメントを示すブール値。デフォルトは false です。

クエリ パラメータ値は、URL セーフになるように適切にエンコードする必要があります。auth-token フィールドでは、/+= 文字を含めることができるため、これは特に重要です。

マニフェストの例(セグメントの置換後)
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0

#EXTINF:5.005,
contentorigin.com/1.ts
#EXTINF:5.005,
contentorigin.com/2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.005,
https://dai.google.com/linear/pods/v1/seg/network/6062/custom_asset/iYdOkYZdQ1KFULXSN0Gi7g/pod/1/profile/devrel4628000/0.ts?sd=5005&so=0&pd=18015&auth-token=custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D44bf78223c240cbc5bae3cdfd794bfc6971b6583cd296f44ef3a46944605cf9a&stream_id=fe6c9136-09a4-4ff6-862e-daee1dea0e1b:MRN2
#EXTINF:5.005,
https://dai.google.com/linear/pods/v1/seg/network/6062/custom_asset/iYdOkYZdQ1KFULXSN0Gi7g/pod/1/profile/devrel4628000/1.ts?sd=5005&so=5005&pd=18015&auth-token=custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D44bf78223c240cbc5bae3cdfd794bfc6971b6583cd296f44ef3a46944605cf9a&stream_id=fe6c9136-09a4-4ff6-862e-daee1dea0e1b:MRN2
#EXTINF:5.005,
https://dai.google.com/linear/pods/v1/seg/network/6062/custom_asset/iYdOkYZdQ1KFULXSN0Gi7g/pod/1/profile/devrel4628000/2.ts?sd=5005&so=10010&pd=18015&auth-token=custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D44bf78223c240cbc5bae3cdfd794bfc6971b6583cd296f44ef3a46944605cf9a&stream_id=fe6c9136-09a4-4ff6-862e-daee1dea0e1b:MRN2
#EXTINF:3.000,
https://dai.google.com/linear/pods/v1/seg/network/6062/custom_asset/iYdOkYZdQ1KFULXSN0Gi7g/pod/1/profile/devrel4628000/3.ts?sd=3000&so=15015&pd=18015&auth-token=custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D44bf78223c240cbc5bae3cdfd794bfc6971b6583cd296f44ef3a46944605cf9a&stream_id=fe6c9136-09a4-4ff6-862e-daee1dea0e1b:MRN2&last=true
#EXT-X-DISCONTINUITY
#EXTINF:5.005,
contentorigin.com/7.mp4
#EXTINF:5.005,
contentorigin.com/8.mp4

これで完了です。これで、DAI Pod Serving API によって提供される広告セグメントを使用してライブ配信が配信されます。

DASH ストリーム

DASH ストリームは MPD ファイルとして提供されます。MPD ファイルには、すべてのストリーム エンコードが 1 つのファイルに含まれており、コンテンツは一連のピリオドとして表現されます。

リクエスト期間のテンプレート

Google アド マネージャーに期間テンプレートをリクエストします。このテンプレートは、そこに含まれるマクロが挿入されると、ミッドロール挿入点の期間になります。

このテンプレートはストリーム セッションごとに 1 回だけリクエストし、ミッドロール挿入点で再利用できるようキャッシュに保存してください。

期間のテンプレート リクエスト endpointhjf
GET /linear/pods/v1/dash/network/{network_code}/custom_asset/{custom_asset}/pods.json
Host: dai.google.com
Content-Type: application/json
パスパラメータ
network_code パブリッシャーのアド マネージャー 360 ネットワーク コード。
custom_asset Google アド マネージャーのライブ配信イベントのカスタム アセットキー。
クエリ パラメータ
stream_id クライアントの動画プレーヤーのアド マネージャー ストリーム ID。
レスポンス JSON
dash_period_template 期間テンプレートの XML 文字列。
segment_duration_ms ダッシュ ピリオド テンプレートの各広告メディア セグメントの再生時間(ミリ秒単位)。
リクエストの例(cURL)
curl https://dai.google.com/linear/pods/v1/dash/network/21775744923/custom_asset/tears_of_steel/pods.json?stream-id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS
レスポンスの例
{"dash_period_template":"<Period id="adpod-$$pod-id$$" $$period-start$$ $$period-duration$$> <BaseURL>https://dai.google.com/linear/pods/v1/seg/event/{event_code}/pods/$$pod-id$$/profile/</BaseURL>
 <SegmentTemplate initialization="$RepresentationID$/init.mp4?stream_id={a-stream-id}&amp;sd=5000&pd=$$pod-duration$$&amp;cust_params=$$cust_params$$&amp;auth_token=$$token$$" media="$RepresentationID$/$Number$.mp4?stream_id={a-stream-id}&amp;sd=5000&pd=$$pod-duration$$&amp;cust_params=$$cust_params$$&amp;scte35=$$scte35$$&amp;auth_token=$$token$$" startNumber="1" presentationTimeOffset="0">
  <SegmentTimeline>
    <S t="0" d="5" r="$$number-of-repeated-segments$$"/>
  </SegmentTimeline>
  </SegmentTemplate>
  <AdaptationSet id="0" width="1280" height="720" frameRate="30" contentType="video" subsegmentAlignment="true" startWithSAP="1">
    <InbandEventStream schemeIdUri="https://developer.apple.com/streaming/emsg-id3"/>
    <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
    <Representation mimeType="video/mp4" codecs="avc1.640029" id="a943ff679a2f3e71d9181a21b7542122g" bandwidth="3200000"/>
    <Representation mimeType="video/mp4" codecs="avc1.640029" id="abbbd80q4w5ce2fs28308rd1f4g4bat0" bandwidth="1500000"/>
  </AdaptationSet>
  <AdaptationSet id="1" contentType="audio"> <Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="a87ff679a2f3e71d9181a67b7542122c" bandwidth="95000"/>

    <Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="eccbc87e4b5ce2fe28308fd9f2a7baf3" bandwidth="127000"/>
  </AdaptationSet>
</Period>",
"segment_duration_ms":5000}

生理テンプレートにデータを入力する

期間テンプレートには複数のマクロが含まれており、ミッドロール挿入点ごとに置き換える必要があります。すべてのマクロを置き換える必要があります。未使用のマクロは、空の文字列("")で置き換える必要があります。

マクロ 説明
$$pod-id$$ この期間が表す連続配信広告のインデックス。この値は、すべての閲覧者セッションで同じ Pod に対して一致している必要があります。 1
$$period-start$$ 現在の MPD で期間が開始する時刻。start="###" に置き換えるオプションの属性。### はミッドロール挿入点の開始時間です。期間の開始時間が指定されていない場合、このマクロは空の文字列で置き換える必要があります。 start="PT2H33M30S"
$$period-duration$$ 広告期間全体の期間。duration="###" に置き換えるオプションの属性。ここで、### は標準の DASH 期間形式での広告期間の長さです。期間が指定されていない場合は、このマクロを空の文字列に置き換えてください。 duration="PT15S"
$$pod-duration$$ この連続配信広告について決定される広告の予想再生時間(ミリ秒単位)。 15000
$$number-of-repeated-segments$$ この値は、広告期間の長さ(ミリ秒単位)を segment_duration_ms の値で除算し、最も近い整数に切り上げて計算されます。 3
$$cust_params$$ このマクロは、現在のミッドロール挿入点に固有のカスタム ターゲティング パラメータ(提供されている場合)に置き換えることができます。値は、こちらのアド マネージャーのヘルプセンター記事で説明されている形式にする必要があります。カスタム パラメータが必要ない場合は、このマクロを空の文字列に置き換えてください。 &cust_params=section%3Dblog%26anotherKey%3Dvalue1%2Cvalue2
$$scte35$$ このマクロは、広告ブレークに固有の scte35 値が指定されている場合は、その値で置き換える必要があります。scte35 情報が必要ない場合は、このマクロを空の文字列に置き換える必要があります。 /DAqAAAAAAAA///wDwVAAAT2f0/+ecF1mQABC/8ACgAIQ1VFSQAAAAsuZVlR
$$token$$ 署名付きの URL エンコードされた HMAC トークン。このトークンは必須です。 custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D6a8c44c72e4718ff63ad2284edf2a8b9e319600b430349d31195c99b505858c9
マクロを含む、生期間テンプレート
<Period id="adpod-$$pod-id$$" $$period-start$$ $$period-duration$$>
  <BaseURL>
    https://dai.google.com/linear/pods/v1/seg/event/{event_code}/pods/$$pod-id$$/profile/
  </BaseURL>
  <SegmentTemplate initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&amp;sd=5000&pd=$$pod-duration$$&amp;cust_params=$$cust_params$$&amp;auth_token=$$token$$" media="$RepresentationID$/$Number$.mp4?stream_id=ç√&amp;sd=5000&pd=$$pod-duration$$&amp;cust_params=$$cust_params$$&amp;scte35=$$scte35$$&amp;auth_token=$$token$$" startNumber="1" presentationTimeOffset="0">  
    <SegmentTimeline>
      <S t="0" d="5" r="$$number-of-repeated-segments$$"/>
    </SegmentTimeline>
  </SegmentTemplate>
  <AdaptationSet id="0" width="1280" height="720" frameRate="30" contentType="video" subsegmentAlignment="true" startWithSAP="1">
    <InbandEventStream schemeIdUri="https://developer.apple.com/streaming/emsg-id3"/>
    <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
    <Representation mimeType="video/mp4" codecs="avc1.640029" id="a943ff679a2f3e71d9181a21b7542122g" bandwidth="3200000"/>
    <Representation mimeType="video/mp4" codecs="avc1.640029" id="abbbd80q4w5ce2fs28308rd1f4g4bat0" bandwidth="1500000"/>
  </AdaptationSet>
  <AdaptationSet id="1" contentType="audio"> <Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="a87ff679a2f3e71d9181a67b7542122c" bandwidth="95000"/>
    <Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="eccbc87e4b5ce2fe28308fd9f2a7baf3" bandwidth="127000"/>
  </AdaptationSet>
</Period>
入力済みの広告期間
<Period id="pod-0" start="PT5H50M12S">
  <BaseURL>
    https://dai.google.com/linear/pods/v1/seg/event/M-nTcApTRTi6CEGIt4GYMw/pod/0/profile/
  </BaseURL>
  <SegmentTemplate startNumber="0" media="1080p/0.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&amp;sd=5000&amp;pd=30000&amp;cust_params=&amp;auth-token=&amp;scte35=" initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&amp;pd=30000&amp;cust_params=&amp;auth-token=&amp;scte35=">
    <SegmentTimeline>
      <S d="5" r="1"/>
    </SegmentTimeline>
  </SegmentTemplate>
  <AdaptationSet mimeType="video/mp4" scanType="progressive" contentType="video">
    <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
    <Representation width="768" height="432" frameRate="30" codecs="avc1.42c01e" id="fmp4-video-1200k" bandwidth="1300000">
      <InbandEventStream schemeIdUri="https://developer.apple.com/streaming/emsg-id3"/>
    </Representation>
  </AdaptationSet>
  <AdaptationSet mimeType="audio/mp4" scanType="progressive" contentType="audio">
    <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
      <Representation audioSamplingRate="48000" codecs="mp4a.40.2" id="fmp4-audio-128kbps" bandwidth="128000">
      <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
    </Representation>
  </AdaptationSet>
</Period>

入力済みの期間を DASH マニフェストに挿入する

最後に、未加工のマニフェスト内の適切な期間を、新しく入力された広告期間に置き換えて、最終的に合成されたマニフェストをリクエスト元の動画クライアントに返します。

未加工コンテンツ マニフェストの例
<?xml version="1.0"?>
  <MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:DASH:schema:MPD:2011" xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011" profiles="urn:mpeg:dash:profile:isoff-main:2011" type="static" mediaPresentationDuration="PT0H9M56.46S">
    <BaseURL>
      http://example.com/tears_of_steel/
    </BaseURL>
    <Period start="PT0S">
      <AdaptationSet bitstreamSwitching="true">

        <Representation id="0" codecs="avc1" mimeType="video/mp4" width="1920" height="1080" startWithSAP="1" bandwidth="500000">
          <SegmentBase>
            <Initialization sourceURL="segments/1080/1.m4s" range="0-862"/>
          </SegmentBase>
          <SegmentList duration="15">
            <SegmentURL media="segments/1080p/2.m4s" mediaRange="863-7113"/>
            <SegmentURL media="segments/1080p/3.m4s" mediaRange="7114-14104"/>
            <SegmentURL media="segments/1080p/4.m4s" mediaRange="14105-17990"/>
            ...
          </SegmentList>
        </Representation>

        <Representation id="1" codecs="avc1" mimeType="video/mp4" width="1280" height="720" startWithSAP="1" bandwidth="250000">
          <SegmentBase>
            <Initialization sourceURL="segments/720p/1.m4s" range="0-864"/>
          </SegmentBase>
          <SegmentList duration="15">
            <SegmentURL media="segments/720p/2.m4s" mediaRange="865-11523"/>
            <SegmentURL media="segments/720p/3.m4s" mediaRange="11524-25621"/>
            <SegmentURL media="segments/720p/4.m4s" mediaRange="25622-33693"/>
            ...
          </SegmentList>
        </Representation>

        <Representation id="1" codecs="avc1" mimeType="video/mp4" width="640" height="480" startWithSAP="1" bandwidth="100000">
          <SegmentBase>
            <Initialization sourceURL="segment/480p/1.m4s" range="0-865"/>
          </SegmentBase>
          <SegmentList duration="15">
            <SegmentURL media="segment/480p/2.m4s" mediaRange="866-26970"/>
            <SegmentURL media="segment/480p/3.m4s" mediaRange="26971-72543"/>
            <SegmentURL media="segment/480p/4.m4s" mediaRange="72544-95972"/>
            ...
          </SegmentList>
        </Representation>
        ...
      </AdaptationSet>
    </Period end>
  </MPD>
合成されたマニフェストの例
<?xml version="1.0"?>
  <MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:DASH:schema:MPD:2011" xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011" profiles="urn:mpeg:dash:profile:isoff-main:2011" type="static" mediaPresentationDuration="PT0H9M56.46S">
    <BaseURL>
      http://example.com/tears_of_steel/
    </BaseURL>
    
    <Period id="pod-0" start="PT5H50M12S">
  <BaseURL>
    https://dai.google.com/linear/pods/v1/seg/event/M-nTcApTRTi6CEGIt4GYMw/pod/0/profile/
  </BaseURL>
  <SegmentTemplate startNumber="0" media="1080p/0.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&amp;sd=5000&amp;pd=30000&amp;cust_params=&amp;auth-token=&amp;scte35=$$scte35$$" initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&amp;pd=30000&amp;cust_params=&amp;auth-token=&amp;scte35=$$scte35$$">
    <SegmentTimeline>
      <S d="5" r="1"/>
    </SegmentTimeline>
  </SegmentTemplate>
  <AdaptationSet mimeType="video/mp4" scanType="progressive" contentType="video">
    <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
    <Representation width="768" height="432" frameRate="30" codecs="avc1.42c01e" id="fmp4-video-1200k" bandwidth="1300000">
      <InbandEventStream schemeIdUri="https://developer.apple.com/streaming/emsg-id3"/>
    </Representation>
  </AdaptationSet>
  <AdaptationSet mimeType="audio/mp4" scanType="progressive" contentType="audio">
    <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
      <Representation audioSamplingRate="48000" codecs="mp4a.40.2" id="fmp4-audio-128kbps" bandwidth="128000">
      <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
    </Representation>
  </AdaptationSet>
</Period>
    
</MPD>

これで完了です。これで、DAI Pod Serving API によって提供される広告セグメントを使用して DASH ライブ配信が配信されます。

参考情報