DASH で YouTube のライブ コンテンツを配信

このドキュメントでは、DASH 配信形式を使用して YouTube のエンコーダにライブデータをストリーミングするためのガイドラインを示します。エンコーダ ベンダーが自社サービスに DASH 配信サポートを追加できるようにすることを目的としています。

DASH について

以下に、DASH の主な機能と属性を示します。

  • オープン標準に基づいています。
  • HTTP ベースです。そのため、DASH はインターネット インフラストラクチャに対応しており、ファイアウォールを通過できます。
  • 高転送ビットレートをサポートします。DASH では、複数の同時 HTTP セッションと非シーケンシャル セグメント配信がサポートされるため、1 つの TCP 接続に依存するプロトコルに比べて復元力が向上します。
  • HTTPS で安全に配信。
  • HTTP と HTTPS によるロスレス配信。
  • コーデックに依存しません。
  • H264、AAC を含む MP4、VP8/VP9、Vorbis/Opus を含む WebM に対応しています。

仕様

要件

以降のサブセクションでは、DASH を使用して YouTube にライブ ストリーミングを配信する場合の要件について説明します。

タイミング

YouTube DASH エンドポイントはパッシブ HTTP サーバーとして動作し、エンコーダから送信された PUT メソッド呼び出しを記録します。

  • DASH エンドポイントは、同時 TCP 接続をサポートします。接続は HTTP/1.1 に従って再利用できます。
  • MPD セグメントと初期化セグメントは、最初のメディア セグメントから 3 秒以内に挿入する必要があります。(MPD に初期化セグメントを含めることをおすすめします)。
  • 各セグメントまたは MPD には、個別の PUT リクエストを使用する必要があります。複数のセグメントをマルチパートでアップロードすることはできません。
  • メディア セグメントの PUT オペレーションは、アップロードの帯域幅を改善するために、時間的に重複する場合があります。
  • セグメントは、約 3 秒の時間枠内で非順番に指定できます。
  • MPD セグメントと初期化セグメントは、更新された availabilityStartTimestartNumber を使用して少なくとも 60 秒ごとに更新する必要があります。前述のとおり、初期化セグメントを MPD に含めることができます。その場合、1 つの PUT リクエストで両方のセグメントを更新できます)。

URL 構造

エンコーダは、YouTube エンドポイントのベース URL に文字列を追加して、PUT URL を形成する必要があります。YouTube Live Streaming API を使用して、DASH 取り込みエンドポイントを作成する必要があります。

エンコーダはその後、YouTube Live Streaming API を介して、エンドポイントのベース URL をプログラムで取得できます。ベース URL をエンコーダに手動で提供する場合は、YouTube ライブイベント UI にも表示されます。

ベース URL に追加する文字列には、次の ASCII 文字セットを使用できます。

  • 小文字: a ~ z
  • 大文字: A ~ Z
  • 0 から 9 までの数字
  • 特殊文字: _(アンダースコア)、-(ハイフン)、.(ピリオド)

MPD の URL

上記の要件に加えて、MPD の URL は .mpd で終わる必要があります。これにより、YouTube サーバーは MPD を簡単に識別できるようになります。他のセグメントの URL の末尾を .mpd にすることはできません。

初期化とメディア セグメントの URL

データが ISO BMFF コンテナにある場合、初期化セグメント URL とすべてのメディア セグメント URL は .mp4 で終わる必要があります。データが WebM コンテナにある場合、.webm で終わる必要があります。

MPD コンテンツ

MPD は、DASH 標準に準拠し、完全である必要があります。次の各要素を 1 つだけ含める必要があります。このリストには YouTube で特に必要な要素が示され、DASH 規格では追加の必須要素が識別される場合があります。要素は XPath 構文を使用して表され、DASH 規格と同じです。

  • /mpd:MPD/attribute::type
  • /mpd:MPD/mpd:Period
  • /mpd:MPD/mpd:Period/mpd:AdaptationSet
  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/attribute::mimeType (video/mp4 or video/webm)
  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate
  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute::media
  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute::initialization
  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute::startNumber

要素の値には以下の要件があります。

  • <MPD> 要素の minimumUpdatePeriod 属性は、60 秒(PT60S)以下の値に設定する必要があります。
  • <SegmentTemplate> 要素の media 属性では、メディア セグメント URL が $Number$ を使用して生成されるように指定する必要があります。(startNumber メディア属性は、最初のメディア セグメントに割り当てられる番号を識別します)。

初期化セグメントの長さ

初期化セグメントは 100 KB 以下にする必要があります。(通常、初期化のセグメントはそれよりはるかに小さいです)。MPD に「初期化」セグメントが含まれる場合、このセグメントを含む data: URL は 100 KB 以下にする必要があります。

エンコーダ出力

初期化セグメントとメディア セグメントは、クローズド型の GOP(画像のグループ)を含む ISO BMFF または WebM の多重化ファイル ストリームを構成する必要があります。

  • GOP サイズは約 2 秒、8 秒未満でなければなりません。
  • 多重化ストリームには音声トラックと動画トラックの両方を含める必要があります。

その他のおすすめの方法

暗号化

YouTube は HTTPS を介したストリーム暗号化をサポートしています。この機能を使用することを強くおすすめします。

MPD の初期化セグメント

MPD の初期化セグメントは、RFC 2397 に沿って data: URL を使用して直接表現できます。これにより、ストリームの設定がシンプルになり、初期化セグメントが他のストリーミングに対応しない可能性が低くなります。

この要素の XPath は次のとおりです。

/mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute:data

ターゲット セグメントの期間

取り込みのパフォーマンスが良好で、スループットとレイテンシのバランスが良い場合は、メディア セグメントの長さを 1 ~ 5 秒にする必要があります。MPD では、以下の 2 つの要素を使ってセグメントのターゲット時間を知らせることを強くおすすめします。

  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute::duration
  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute::timescale

これらの属性から計算される持続時間は、実際のセグメント期間全体の 2 倍以内である必要があります。そうしないと、ストリーミングのパフォーマンスが低下する可能性があります。

取り込みのターゲット時間は、YouTube が生成するライブ ストリームのチャンク時間と同じではありません。YouTube は入力をコード変換して再チャンクします。出力ターゲット時間は、ストリームがストリーミング品質向けに最適化されているか、レイテンシを重視して最適化されているかによって異なります。

再試行と指数バックオフ

すべての HTTP PUT リクエストはタイムアウト時間で実行する必要があります。セグメントの長さより 500 ミリ秒大きい値に設定することをおすすめします。

タイムアウトやその他のエラーが原因で失敗したメディア セグメント PUT リクエストは、動画ストリームのギャップに対応します。そのため、ランダム化された指数指数バックオフを使用して、このようなリクエストを再試行する必要があります。

  1. 障害が発生した後、ランダムな間隔([0 ... 100] ミリ秒)を待機してリクエストを再試行します。
  2. リクエストが再び失敗した場合は、[0 ... 200] ミリ秒間隔で待機してからリクエストを再試行します。
  3. リクエストが再び失敗した場合は、[0 ... 400] ミリ秒間隔で待機してからリクエストを再試行します。
  4. その他

ブロードキャストの失敗に対応するため、失敗が繰り返される場合、エンコーダ オペレーターに通知する必要があります。

HTTP レスポンス コード

以下のセクションでは、DASH で配信されるセグメントに応じて YouTube から返されるレスポンス コードについて説明します。

200(OK)

HTTP 200(OK)レスポンスは、YouTube サーバーが想定されるオペレーションを受信し、それを正常に処理したことを示します。

202 (受理済み)

PUT または POST オペレーションに対する HTTP 202(Accepted)レスポンスは、オペレーションが予期しないもので、処理の遅延に対して許容されたことを示します。ただし、この遅延オペレーションは成功または失敗の可能性があるため、レスポンスで YouTube がオペレーションを正常に処理できるとは限りません。

この応答は、セグメントが順次配信されないときに最も頻繁に発生します。通常、承認済みのセグメントは、前述のセグメントの受信後に正しく処理されるため、セグメントを再送信する必要はありません。

たとえば、次のいずれかの場合、YouTube は 202 レスポンスを返すことができます。

  • MPD の前に初期化セグメントを受信する。
  • メディア セグメントは、MPD セグメントと初期化セグメントの前に受信されます。
  • メディア セグメントが前のセグメントより先に受信されます(セグメント 3 がセグメント 2 の前に受信される場合など)。

ただし、202 レスポンスは、POST または PUT リクエストの受信時に YouTube が識別子を完全に検証できない場合、アイテム識別子が正しくないことを示します。たとえば、MPD を受信する前に初期化セグメントを受け取って受け入れたが、初期化セグメントが無効になったことが起きる場合があります。この場合、YouTube は初期化セグメントを受け入れ、202 を返し、MPD の受信時にそのセグメントが有効かどうかを判断します。MPD に初期化セグメントを含めることで、このようなシナリオを回避できます。

400(不正なリクエスト)

HTTP 400(不正なリクエスト)レスポンスは、次のいずれかの問題が発生したことを示します。

  • URL の形式が正しくありません
  • 投稿が大きすぎます(10 MB 超)
  • MPD を解析できません
  • MPD の初期化セグメントが破損しています

401(未承認)

HTTP 401(未承認)レスポンスは、YouTube DASH エンドポイントのベース URL が破損しているか期限切れになっていることを示します。

405(許可されない方法)

HTTP 405(メソッドは許可されません)レスポンスは、POST または PUT 以外のリクエストが送信されたことを示します。

409(競合)

PUT または POST オペレーションに対する HTTP 409(競合)レスポンスは、YouTube がリクエストを処理できないことを示します。たとえば、報告者が多数のメディア セグメントを送信したが、YouTube に MPD、初期化セグメント、またはその両方が存在しない場合にこの応答が発生することがあります。その場合、失敗したリクエストを再試行する前に、MPD セグメントと初期化セグメントを再送信する必要があります。

500(内部サーバーエラー)

HTTP 500(内部サーバーエラー)レスポンスは、サーバーがリクエストを処理できなかったことを示します。この場合は、指数バックオフを指定してリクエストを再試行することをおすすめします。

URL シーケンス

以下の URL シーケンスは、DASH 経由でコンテンツを配信する一連の PUT リクエストを示しています。このシーケンスでは、YouTube DASH エンドポイントのベース URL が次のとおりであることを前提としています。

http://upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=

このシーケンスでは、MPD セグメントと初期化セグメントが別々に送信されています。ただし、初期化セグメントは MPD で直接表現できるため、その取り扱いをおすすめします。また、MPD と初期化のセグメントは 60 秒以上更新してください。最終的には、これらのセグメントの URL がこのシーケンスで再度発生し、その後により多くのメディア セグメントの URL が続きます。

PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=dash.mpd
PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=init.mp4
PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=media001.mp4
PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=media002.mp4
PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=media003.mp4
...

WebM セグメント

MPD に初期化セグメントを埋め込み

次の MPD の例では、RFC 2397 のデータ URL に初期化セグメントが埋め込まれています。初期化セグメントは、個別に送信するのではなく、このように埋め込むことをおすすめします。

この例は、YouTube への WebM(VP8 または VP9、Opus)への取り込みに対応しています。データ URL の大部分は、読みやすくなっていません。

<?xml version="1.0" encoding="UTF-8"?>
<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 DASH-MPD.xsd"
     type="dynamic" 
     profiles="urn:mpeg:dash:profile:isoff-live:2011" 
     minimumUpdatePeriod="PT60S"
     minBufferTime="PT12S"
     availabilityStartTime="2016-04-13T20:52:58" >
  <Period start="PT0S" id="1">
    <AdaptationSet mimeType="video/webm">
      <ContentComponent contentType="video" id="1"/>
      <SegmentTemplate timescale="1000"
           duration="2000"
           startNumber="1"
           initialization="data:video/mp4;base64,AAAAGGZ0eXBpc...AAA"
           media="/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=media-$Number%09d$.webm"/>
      <Representation id="1" width="1920" height="1080">
        <SubRepresentation contentComponent="1"/>
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

MPD は、

以下の MPD のサンプルには、初期化セグメントが埋め込まれていませんが、WebM(VP8 または VP9、Opus)による YouTube への取り込みにも適合します。

<?xml version="1.0" encoding="UTF-8"?>
<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 DASH-MPD.xsd"
     type="dynamic" 
     profiles="urn:mpeg:dash:profile:isoff-live:2011" 
     minimumUpdatePeriod="PT60S"
     minBufferTime="PT12S"
     availabilityStartTime="2016-04-13T20:52:58" >
  <Period start="PT0S" id="1">
    <AdaptationSet mimeType="video/webm">
      <ContentComponent contentType="video" id="1"/>
      <SegmentTemplate timescale="1000"
           duration="2000"
           startNumber="1"
           initialization="/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=init.webm"
           media="/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=media-$Number%09d$.webm"/>
      <Representation id="1" width="1920" height="1080">
        <SubRepresentation contentComponent="1"/>
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

初期化

サンプル WebM 初期化セグメントのレイアウトを以下に示します。これは、WebM ストリームの一部(最初のクラスタを除く)で構成されます。

Media

サンプル WebM メディア セグメントのレイアウトを以下に示します。単一の WebM クラスタで構成されています。ISO BMFF ストリームの場合と同様に、一連のクラスタの前に初期化セグメントを追加すると、有効な WebM ストリームが生成されます。

ISO BMFF セグメント

MPD に初期化セグメントを埋め込み

次の MPD の例では、RFC 2397 のデータ URL に初期化セグメントが埋め込まれています。初期化セグメントは、個別に送信するのではなく、このように埋め込むことをおすすめします。

この例は、YouTube への ISO BMFF(H.264、AAC)取り込みに準拠しています。データ URL の大部分は、読みやすくなっていません。

<?xml version="1.0" encoding="UTF-8"?>
<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 DASH-MPD.xsd" 
    type="dynamic"
    minimumUpdatePeriod="PT30S" 
    availabilityStartTime="2016-05-04T20:47:25" 
    minBufferTime="PT12S" 
    profiles="urn:mpeg:dash:profile:isoff-live:2011">
  <Period start="PT0S" id="1">
    <AdaptationSet mimeType="video/mp4" codecs="avc1.4d401e,mp4a.40.2">
      <ContentComponent contentType="video" id="1"/>
      <ContentComponent contentType="audio" id="2"/>
      <SegmentTemplate timescale="600"
             media="/dash_upload?cid=ug50-xg26-cbc1-2p0h&staging=1&copy=0&file=media$Number%09d$.mp4"
             initialization="data:video/mp4;base64,AAAAGGZ0eXBpc281AA...AA"
             duration="306"
             startNumber="1"/>
      <Representation id="1" width="640" height="360" bandwidth="526952">
        <SubRepresentation contentComponent="1" bandwidth="526952" 
codecs="avc1.4d401e"/>
        <SubRepresentation contentComponent="2" bandwidth="125584" codecs="mp4a.40.2"/>
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

MPD は、

初期化セグメントが組み込まれていない次のサンプル MPD は、ISO BMFF(H.264、AAC)YouTube への取り込みにも準拠しています。

<?xml version="1.0" encoding="UTF-8"?>
<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 DASH-MPD.xsd"
     type="dynamic"
     profiles="urn:mpeg:dash:profile:isoff-live:2011"
     minimumUpdatePeriod="PT60S" 
     minBufferTime="PT12S"
     availabilityStartTime="2016-04-13T20:51:31" >
  <Period start="PT0S" id="1">
    <AdaptationSet mimeType="video/mp4" codecs="avc1.4d401e,mp4a.40.2">
      <ContentComponent contentType="video" id="1"/>
      <ContentComponent contentType="audio" id="2"/>
      <SegmentTemplate timescale="600"
           duration="1200"
           startNumber="1"
           initialization="/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=init.mp4"
           media="/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=media$Number%09d$.mp4"/>
      <Representation id="1" width="640" height="360" bandwidth="526952">
        <SubRepresentation contentComponent="1" bandwidth="526952" codecs="avc1.4d401e"/>
        <SubRepresentation contentComponent="2" bandwidth="125584" codecs="mp4a.40.2"/>
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

初期化

次の図は、多重化 ISO BMFF 初期化セグメントのサンプルのレイアウトを示しています。YouTube で必ずしも原子が使用されるとは限りませんが、これは遵守している例です。特に、音声トラックと動画トラックの両方が表示されます。

Media

次の図は、多重化 ISO BMFF メディア セグメントのサンプルのレイアウトを示しています。YouTube ですべての原子が使用されるとは限りませんが、これは遵守している例です。特に、音声トラックと動画トラックの両方が表示されます。一連のセグメントを初期化セグメントに追加すると、有効で完全な多重化 ISO BMFF ストリームを生成できます。

既知の制限事項

RTMP と DASH の取り込み

YouTube への RTMP 取り込みと DASH 取り込みの混在はできません。これは、ブロードキャスト中の 2 つの切り替え方法の場合と、メインの取り込み方法として一方を使用し、もう一つはバックアップ取り込みに使用する場合に適用されます。