DASH を介した YouTube ライブ コンテンツの配信

このドキュメントでは、Dynamic Adaptive Streaming over HTTP(DASH)配信形式を使用して、エンコーダから YouTube でライブデータをストリーミングするためのガイドラインについて説明します。これは、エンコーダ ベンダーが自社の製品に DASH 配信サポートを追加できるようにすることを目的としています。

DASH について

以下のリストに、DASH の主な機能と属性をいくつか示します。

  • オープン標準ベース。
  • HTTP ベース。そのため、DASH はインターネット インフラストラクチャに適しており、ファイアウォールを通過できます。
  • 高い転送ビットレートをサポートします。DASH は、複数の同時 HTTP セッションと非順次セグメント配信をサポートしており、単一の TCP 接続に依存するプロトコルよりも復元性に優れています。
  • HTTPS による安全な配信。
  • HTTP と HTTPS を介したロスレス配信。
  • コーデックに依存しない。
  • H264 と AAC を含む MP4 と、VP8/VP9 と Vorbis/Opus を含む WebM をサポートしています。

仕様

要件

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

タイミング

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

  • DASH エンドポイントは同時 TCP 接続をサポートしています。HTTP/1.1 に従って接続を再利用できます。
  • MPD と初期化セグメントは、最初のメディア セグメントから 3 秒以内に PUT される必要があります。(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 を確認することもできます。

ベース URL に追加される文字列には、次の ASCII 文字を含めることができます。

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

MPD URL

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

初期化 URL とメディア セグメント 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(Group of Pictures)を含む多重化された ISO BMFF または WebM ファイル ストリームで構成されている必要があります。

  • GOP サイズは 2 秒程度で、8 秒未満にする必要があります。
  • 多重化されたストリームには、音声トラックと動画トラックの両方が含まれている必要があります。

その他のベスト プラクティス

暗号化

YouTube は HTTPS によるストリームの暗号化に対応しています。この機能を使用することを強くおすすめします。

MPD の初期化セグメント

RFC 2397 に従って、data: URL を使用して、MPD で初期化セグメントを直接表すことができます。これにより、ストリームの設定が簡素化され、初期化セグメントがストリームの残りの部分に対応しない可能性が低くなります。

この要素の 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 は前のセグメントを受信した後で、受け入れられたセグメントを正しく処理できるため、セグメントを再送信する必要はありません。

たとえば、YouTube は次のような場合に 202 レスポンスを返すことがあります。

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

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

400(不正なリクエスト)

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

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

401(未承認)

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

405(メソッドが許可されていません)

HTTP 405(Method Not Allowed)レスポンスは、POST または PUT 以外のリクエストが送信されたことを示します。

409(競合)

PUT または POST オペレーションに対する HTTP 409(競合)レスポンスは、YouTube がリクエストを処理できないことを示します。たとえば、リクエスト元が多数のメディア セグメントを送信したにもかかわらず、YouTube が MPD、初期化セグメント、またはその両方をまだ取得していない場合に、このレスポンスが返されることがあります。この例では、エンコーダは失敗したリクエストを再試行する前に、MPD セグメントと初期化セグメントを再送信する必要があります。

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

HTTP 500(Internal Server Error)レスポンスは、サーバーがリクエストを処理できなかったことを示します。このエラーについては、指数バックオフを使用してリクエストを再試行することをおすすめします。

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 は、埋め込みの初期化セグメントがないため、YouTube への WebM(VP8 または VP9、Opus)取り込みにも準拠しています。

<?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 ストリームの部分で構成されます。

メディア

次の図は、WebM メディア セグメントのレイアウトの例を示しています。これは、1 つの 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 は、初期化セグメントが埋め込まれていませんが、YouTube への ISO BMFF(H.264、AAC)取り込みにも準拠しています。

<?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 は必ずしもアトムを使用するわけではありませんが、これは準拠した例です。特に、音声トラックと動画トラックの両方が表されます。

メディア

次の図は、多重化された ISO BMFF メディア セグメントのレイアウトの例を示しています。YouTube は必ずしもすべてのアトムを使用するわけではありませんが、これは準拠した例です。特に、音声トラックと動画トラックの両方が表されます。これらのセグメントを初期化セグメントに追加すると、有効で完全な多重化 ISO BMFF ストリームが生成されます。

既知の制限事項

RTMP と DASH の取り込み

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