VOD ストリーム用のマニフェスト マニピュレータ

Pod Serving API は、準備されたアダプティブ ビットレートの動画連続配信広告へのアクセスを提供します。 それらがユーザー向けの HLS または MPEG-DASH メディア再生リスト。

このガイドでは、基本的な Pod Serving マニフェスト操作の実装に焦点を当てています。 提供します

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

マニフェスト マニピュレータには、マニフェストをリッスンする API エンドポイントを指定する必要があります クライアント アプリからのリクエスト。少なくとも、このエンドポイントは クライアント プレーヤー アプリからストリーム ID を収集します。このストリーム ID は 連続配信広告のリクエストでアド マネージャーへのストリーミング セッションを特定できる。

また、組織にとって適切なポリシーを特定するために、 (Content ID など)などです。

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

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

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

マニフェスト リクエストから収集されたコンテンツ ID を使用してコンテンツを選択します 広告と統合します

連続配信広告のマニフェストをリクエストする

アド マネージャーから広告をリクエストするには、サーバーが広告に対する POST リクエストを行う必要があります。 リクエストしたエンコード プロファイル、広告タグ、ターゲティングを渡します。 あります。このリクエストには、ステップで収集したストリーム ID も含まれます。 1.

その代わりに、対応する連続配信広告のマニフェスト ファイルを含むリストが パブリッシャーの広告タグによってリクエストされた連続配信広告、 コンテンツ内のどこに挿入するかを決定できます

POST /ondemand/pods/api/v1/network/{network_code}/streams/{stream_id}/adpods
Host: dai.google.com
Content-Type: application/json
パスパラメータ
network_code パブリッシャーのアド マネージャー 360 ネットワーク コード。
stream_id クライアント動画プレーヤー アプリのストリーム ID。

JSON 本文

本文パラメータ
encoding_profiles Required 受信するエンコード プロファイルの JSON 表現のリスト 自動的に適用されます詳しくは以下をご覧ください。

再生をできるだけシームレスにするには、 コンテンツ ストリームで使用するエンコード プロファイル。

ad_tag Required VMAP 広告をリクエストする広告タグ。
cuepoints Optional ミッドロール挿入点が配置されるコンテンツ ストリーム内のキューポイントのリスト あります。キューポイントは浮動小数点秒単位で測定されます。

位置時間オフセット。これは一般的ではありません。

content_duration_seconds Optional コンテンツの再生時間(秒単位)。

percentage 時間オフセット。これは一般的ではありません。

manifest_type Optional リクエストされている広告ストリームの形式(hls または dash。デフォルト値は hls です。
dai_options Optional マニフェストのレンダリング方法を制御する追加のオプション。 詳しくは以下をご覧ください。
エンコード プロファイル
profile_name Required このエンコード プロファイルの識別子。この値には、任意の文字列を指定できます。 同じ名前を持つ複数のエンコード プロファイルを 同じストリーム内に表示されます
type Required このエンコード プロファイルに記述されているストリームのエンコード タイプ。目次 mediaiframesubtitles です。
container_type Required このエンコード プロファイルで使用されるコンテナ形式。コンテナの形式は次のとおりです。 mpeg2ts さん、fmp4cmaf さん、hls_packed_audio さん
video_settings Optional エンコード プロファイル タイプが iframe の場合は必須です。それ以外の場合は メディアタイプに動画が含まれている場合のみ指定できます。参照: 詳細は下記をご覧ください。
audio_settings Optional エンコード プロファイルに音声が含まれている場合は必須です。タイプが できます。詳しくは以下をご覧ください。
subtitle_settings Optional エンコード プロファイルに字幕が含まれている場合は必須です。 詳しくは以下をご覧ください。
動画の設定
codec Required RFC6381 コーデック文字列。

例: avc1.4d000c

bitrate Required このプロファイルの最大動画ビットレートを表す整数(バイト単位、バイト単位)。 なります。
frames_per_second Required 動画の浮動小数点数 FPS。
resolution Required 動画の「width」と「height」をピクセル単位で格納する、JSON でエンコードされた値。

例: {"width": 640, "height": 320}

音声設定
codec Required RFC6381 コーデック文字列。

例: mp4a.40.5

bitrate Required このプロファイルの最大オーディオ ビットレート(バイト数/バイト)を表す整数 なります。

例: 300000

channels Required 低周波数を含む音声チャンネルの数を表す整数 です。
sample_rate Required オーディオ サンプリング レート(ヘルツ単位)を表す整数。

例: 4800

字幕の設定
format Required インバンド字幕で使用されるファイル形式。指定できる値は次のとおりです。 webvtt または ttml
language Optional RFC5646 言語文字列で表される字幕言語。指定した場合、この値は DASH レンダリングでのみ使用されます。

例: en-us

DAI オプション
dash_profile Optional 連続配信広告のマニフェストに適用する MPEG-DASH プロファイル。この設定は DASH マニフェストのみ。使用できる値は live または on-demand。デフォルト値は on-demand です。

liveMPEG-DASH プロファイルに対応します。 "urn:mpeg:dash:profile:isoff-live:2011"

on-demandMPEG-DASH プロファイルに対応します。 urn:mpeg:dash:profile:isoff-on-demand:2011

ad_pod_timeout Optional 広告の選択と連続配信広告の作成に費やす最大時間(フローティング) ポイント秒です。この時間が経過すると、アド マネージャーからすべての ad_pods レスポンスですでに選択されていて、停止する あります。
sam_id Optional ブロック内のセッションを検索するために使用できる代替デバッグキーを指定します。 ストリーム アクティビティ モニタリングします

レスポンス

レスポンス パラメータ
valid_for dhms におけるこれらの連続配信広告の再生リストの有効期間 (日、時間、分、秒)の形式で指定します。
valid_until これらの連続配信広告の再生リストが ISO8601 として有効になるまでの日時 日時文字列(yyyy-MM-dd'T'hh:mm:ss.sssssssss[+|-]hh:mm) 使用できます。
ad_pods このストリームで選択された連続配信広告のリスト。
連続配信広告
manifest_uris HLS ストリームの場合のみ。エンコード プロファイル ID から HLS マニフェスト URI へのマップ。
mpd_uri DASH ストリームの場合のみ。DASH MPD の URI。
type 連続配信広告のタイプ。連続配信広告のタイプ: premid、または post
start ミッドロール連続配信広告の場合のみ。この連続配信広告が配置されるストリーム内の位置 浮動小数点数秒で挿入されます。
duration この連続配信広告の再生時間(浮動小数点秒単位)。
midroll_index ミッドロール連続配信広告の場合のみ。現在のミッドロール連続配信広告のインデックス。インデックス処理 1 で始まる。

リクエストの例(cURL)

curl -X POST \
     -d '@request-body.json' \
     -H 'Content-Type: application/json' \
  https://dai.google.com/ondemand/pods/api/v1/network/21775744923/streams/6e69425c-0ac5-43ef-b070-c5143ba68541:CHS/adpods

リクエスト本文の例

これは、上記の cURL 呼び出しで参照されている request-body.json の内容です。

{
  "encoding_profiles": [
   {
     "profile_name": "1080p",
     "type": "media",
     "container_type": "mpeg2ts",
     "video_settings": {
       "codec": "avc1.4d000c",
       "bitrate": 5000000,
       "frames_per_second": 30.0,
       "resolution": {
         "width": 1920,
         "height": 1080
       }
     },
     "audio_settings": {
       "codec": "mp4a.40.5",
       "bitrate": 300000,
       "channels": 2,
       "sample_rate": 48000
     }
   },
   {
     "profile_name": "360p",
     "type": "media",
     "container_type": "mpeg2ts",
     "video_settings": {
       "codec": "avc1.4d000d",
       "bitrate": 1000000,
       "frames_per_second": 30.0,
       "resolution": {
         "width": 640,
         "height": 360
       }
     },
     "audio_settings": {
       "codec": "mp4a.40.5",
       "bitrate": 64000,
       "channels": 2,
       "sample_rate": 48000
     }
   },
   {
     "profile_name": "subtitles-webvtt",
     "type": "subtitles",
     "subtitle_settings": {
       "format": "webvtt"
     }
   }
 ],
 "ad_tag": "https://pubads.g.doubleclick.net/gampad/ads?...",
 "manifest_type": "hls"
}

レスポンスの例

{
  "valid_for": "8h0m0s",
  "valid_until": "2023-03-24T08:30:26.839717986-07:00",
  "ad_pods": [
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/0/profile/1080p.m3u8",
        "360p": "https://{...}/pod/0/profile.m3u8",
        "subtitles-webvtt": "https://{...}/pod/0/profile/subtitles-en.vtt"
      },
      "type": "pre",
      "duration": 10.0
    },
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/1/profile/1080p.m3u8",
        "360p": "https://{...}/pod/1/profile.m3u8",
        "subtitles-webvtt": "https://{...}/pod/1/profile/subtitles-en.vtt"
      },
      "type": "mid",
      "start": 15.0,
      "duration": 15.0,
      "midroll_index": 1
    },
    {
      "manifest_urls":{
        ]"1080p": "https://{...}/pod/2/profile/1080p.m3u8",
        "360p": "https://{...}/pod/2/profile.m3u8",
        "subtitles-webvtt": "https://{...}/pod/0/profile/subtitles-en.vtt""
      },
      "type": "post",
      "duration": 10.0
    }
  ]
}

連続配信広告をコンテンツに組み込む

連続配信広告をコンテンツ ストリームに組み込むプロセスは、 ストリーム形式、使用する機能に応じて異なります。 をフォーマットの仕様から実装します。以下のワークフローは 提案することもあります広告主の正確な 実装は、ビジネスニーズやコンテンツに応じて異なります。 使用できます。

HLS ストリーム

HLS 形式でストリームを合成する場合、コンテンツ ストリームは マルチバリエーション 再生リスト 個別のストリーム マニフェストへのリンク(エンコード プロファイルごとに 1 つ)が含まれます。お客様の広告 各バリアント マニフェストに Pod を挿入する必要があります。一方、 すべてのバリアント マニフェストを準備して、それを Content API の 配信ネットワーク(CDN) 説明します。最後のマルチバリエーション再生リストは、CDN でホストされる 使用します。

エンコード プロファイルを反復処理する

エンコード プロファイルごとに、関連するすべての広告連続配信広告のマニフェストを アド マネージャーのレスポンス、および関連する開始時間。プレロール広告用 Pod の場合は、開始時間を 0 に設定します。ポストロールの場合は、コンテンツの再生時間を 指定することもできます。マルチバリアントのバリアント ストリームを特定する 各エンコード プロファイルの音声と動画の設定に一致する再生リストが作成されます。

連続配信広告の配列の例
"ad_pods": [
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/0/profile/1080p.m3u8",
        "360p": "https://{...}/pod/0/profile/360p.m3u8",
        "subtitles-en": "https://{...}/pod/0/profile/subitles-en.vtt"
      },
      "type": "pre",
      "duration": 10.0
    },
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/1/profile/1080p.m3u8",
        "360p": "https://{...}/pod/1/profile/360p.m3u8",
        "subtitles-en": "https://{...}/pod/1/profile/subitles-en.vtt"
      },
      "type": "mid",
      "start": 15.0,
      "duration": 15.0,
      "midroll_index": 1
    },
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/2/profile/1080p.m3u8",
        "360p": "https://{...}/pod/2/profile/360p.m3u8",
        "subtitles-en": "https://{...}/pod/2/profile/subitles-en.vtt"
      },
      "type": "post",
      "duration": 10.0
    }
  ]
マルチバリエーション コンテンツ再生リストの例
#EXTM3U
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs0",LANGUAGE="en",NAME="English",AUTOSELECT=YES,DEFAULT=YES,URI="https://{...}/subitles-en.vtt"
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://{...}/1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://{...}/360p.m3u8
収集されたバリアント データの例
Encoding profile: "1080p"
Profile settings: {...}
Content manifest: https://{...}/1080p.m3u8
Ad pods (start time -> manifest):
    0 -> https://{...}/pod/0/profile/1080p.m3u8
   15 -> https://{...}/pod/1/profile/1080p.m3u8
  600 -> https://{...}/pod/2/profile/1080p.m3u8

各バリアント マニフェストに広告を挿入する

バリアント ストリームごとに、コンテンツ マニフェストのセグメントを調べ、 コンテンツの経過時間の合計です開始位置に到達したら 作成、連続配信広告のマニフェストからセグメントのリストを抽出し、 2 つの #EXT-X-DISCONTINUITY タグでセグメントのリストを作成し、そのリストを 現在の場所を指定します。広告がすべてのユーザーに表示されるまで Pod とバリアント ストリームが処理されました。

作成されるマニフェストは HLS 標準に準拠している必要があります。そのため コンテンツ マニフェストに組み込まれている仕様のどの機能を使用するかは、 メディアを修正するために、複合的なマニフェストに対する最終パスの実行が必要になる場合があります コンテンツの長さ、不連続性シーケンス番号、その他の 新しい広告セグメントを考慮するために更新が必要な他のタグが表示されます。 標準との差異を修正したら、 ユーザー固有のバリアント マニフェストを CDN に追加してホスティングします。

コンテンツ マニフェストが暗号化されている場合は、最後の暗号化を保存する必要があります。 現在の連続配信広告の開始前に #EXT-X-KEY タグで検出されたキー。その後、 #EXT-X-KEY:METHOD=NONE タグを追加して暗号化を解除してから、 各連続配信広告の最初のセグメントに 割り当てられます最後に、保存されているファイルのコピーを 各連続配信広告の後のコンテンツの最初のセグメントの前に #EXT-X-KEY タグを配置して、 コンテンツの暗号化を復元します。

収集されたバリアント データの例
Encoding profile: "1080p"
Content manifest: https://{...}/1080p.m3u8
Ad pods (start time -> manifest):
    0 -> https://dai.google.com/{...}pod/0/profile/1080p.m3u8
   15 -> https://dai.google.com/{...}pod/1/profile/1080p.m3u8
  600 -> https://dai.google.com/{...}pod/2/profile/1080p.m3u8
コンテンツ マニフェストの例

これは、https://{...}/1080p.m3u8マニフェストのリストにある バリエーションデータを収集します。

#EXTM3U
{...}
#EXTINF:5.000,
https://{...}/1080p/content-segment-0.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-1.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-2.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-3.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-4.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-5.ts
{...}
連続配信広告のマニフェストの例

これが https://dai.google.com/{...}/pod/1/profile/1080p.m3u8 マニフェスト バリエーションデータの一覧に表示されます。

#EXTM3U
{...}
#EXTINF:5.000,
https://dai.google.com/{...}/0.ts
#EXTINF:5.000,
https://dai.google.com/{...}/1.ts
#EXTINF:5.000,
https://dai.google.com/{...}/2.ts
合成されたバリアント マニフェストの例

これが合成されたバリアント マニフェストになり、CDN に渡され、 https://cdn.{...}/{userid}/1080p.m3u8 でホストされています。

#EXTM3U
{...}
#EXTINF:5.000,
https://{...}/1080p/content-segment-0.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-1.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
https://dai.google.com/{...}/0.ts
#EXTINF:5.000,
https://dai.google.com/{...}/1.ts
#EXTINF:5.000,
https://dai.google.com/{...}/2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
https://{...}/1080p/content-segment-3.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-4.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-5.ts
{...}

マルチバリエーション再生リストを作成する

完成したバリアント マニフェストごとに、CDN アドレスと、 プロファイルの詳細が照合されて、結果が 記述できます。このユーザー固有のマニフェストがレスポンスとして返されます。 マニフェスト リクエストに追加します。

最終的なマルチバリエーション再生リストの例
#EXTM3U
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs0",LANGUAGE="en",NAME="English",AUTOSELECT=YES,DEFAULT=YES,URI="https://cdn.{...}-subitles-en.vtt"
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://cdn.{...}/{userid}/1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://cdn.{...}/{userid}/360p.m3u8

MPEG DASH ストリーム

MPEG DASH 形式のストリームを合成する場合、必要なのは 作成します。これにより、DASH ストリームは HLS よりも簡単に合成できます。

MPEG DASH Media Presentation Description(MPD)ファイルは適切に準備する必要があります。 複数の期間で構成され、各期間には複数の表現が含まれています。各 いずれかのエンコード プロファイルと一致している必要があります。返される各連続配信広告 ダウンロードされる MPD ファイルも MPD ファイルです。このファイルには、 表現されます。

これらの MPD ファイルを合成するには、まず、 指定することもできますプレロールの場合は、コンテンツの前にプレロール連続配信広告の期間を挿入します です。ポストロールの場合は、すべてのコンテンツの後にポストロール連続配信広告の期間を挿入します です。コンテンツ MPD 内の期間に対してイテレーションを行い、 処理されたすべてのコンテンツ期間の経過時間です。上限に達した場合 連続配信広告の開始時間に対応する期間の間に その境界にある MPD ファイルから広告が抽出されます。

最終的に合成された MPD ファイルは、MPEG_DASH 仕様に完全に準拠している必要があります。 そのため、最終的なファイルをもう一度手直しし、修正が必要な部分を 調整し、メディア プレゼンテーションの再生時間を修正して 新しく挿入される広告期間、その他の競合によって生じる可能性のある スティッチングの過程で発生します

コンテンツの例 MPD

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H10M00.000S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
  <ProgramInformation moreInformationURL="http://.../info">
    <Title>Example Stream</Title>
  </ProgramInformation>
  <Period duration="PT0H0M15.000S" id="content-period-1">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-2">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-3">
    ...
  </Period>
  ...
</MPD>

連続配信広告の JSON の例

[{
  "mpd_uri": "https://{...}pod/1.mpd",
  "type": "mid",
  "start": 15.0,
  "duration": 15.0,
  "midroll_index": 1
}]

連続配信広告の MPD の例

これは、上記の連続配信広告の JSON の mpd_uri の内容です。

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H0M15.000S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
  <ProgramInformation moreInformationURL="http://.../info">
    <Title>Ad Pod 1</Title>
  </ProgramInformation>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-1">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-2">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-3">
    ...
  </Period>
  ...
</MPD>

合成された MPD の例

これを最初のストリーム マニフェスト リクエストに対するレスポンスとして使用します。

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H10M15.000S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
  <ProgramInformation moreInformationURL="http://.../info">
    <Title>Example Stream</Title>
  </ProgramInformation>
  <Period duration="PT0H0M15.000S" id="content-period-1">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-1">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-2">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-3">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-2">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-3">
    ...
  </Period>
  ...
</MPD>

参考情報