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 エンドポイントはパッシブな HTTP サーバーとして動作し、エンコーダから送信された PUT メソッド呼び出しを記録します。

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

URL 構造

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

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

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

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

MPD の URL

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

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

初期化セグメント URL とすべてのメディア セグメント URL の末尾は、データが ISO BMFF コンテナ内にある場合は .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 属性では、$Number$ を使用してメディア セグメントの URL を生成することを指定する必要があります。(startNumber 属性は、最初のメディア セグメントに割り当てられる番号を示します)。

初期化セグメントの長さ

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

エンコーダ出力

初期化セグメントとメディア セグメントは、クローズド GOP(ピクチャのグループ)を持つ多重化された 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 秒にする必要があります。次の 2 つの要素を使用して、MPD でこれらのセグメントのターゲット時間を伝えることを強くおすすめします。

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

これらの属性から計算される再生時間は、実際のすべてのセグメント継続時間の 2 分の 1 以内に収まる必要があります。そうでない場合、ストリーミングのパフォーマンスが低下する可能性があります。

取り込みのターゲット時間は、YouTube が生成するライブ配信のチャンク時間とは異なります。YouTube は入力をコード変換して再チャンクします。出力ターゲット時間は、ストリームがストリーミング品質とレイテンシのどちらを考慮して最適化されているかによって異なります。

再試行と指数バックオフ

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

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

  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 の前に受信されるなど)。

ただし、POST または PUT リクエストを受け取っても YouTube が ID を完全には検証できない場合、202 レスポンスによってアイテム ID が正しくないことが示されます。たとえば、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 には初期化セグメントが埋め込まれていませんが、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 メディア セグメントのレイアウトを示します。これは、単一の 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 つを切り替える場合や、一方をメインの取り込み方法として使用し、もう一方をバックアップの取り込みに使用する場合に適用されます。