透過 DASH 提供直播 YouTube 內容

本文件提供使用 DASH 放送格式從編碼器串流 YouTube 即時資料的相關規範。其目的在於協助編碼器廠商為自家產品新增 DASH 提供支援。

瞭解 DASH

以下列舉幾項重要的 DASH 功能與屬性:

  • 以開放式標準為依據。
  • 以 HTTP 為基礎。因此,DASH 十分適合網際網路的基礎架構,也能掃遍防火牆。
  • 支援高傳輸位元率。DASH 支援多個同時進行的 HTTP 工作階段與非依序傳送的傳送功能,因此比起採用單一 TCP 連線的通訊協定,可提供更高的彈性。
  • 透過 HTTPS 安全傳輸。
  • 透過 HTTP 和 HTTPS 提供無縫接軌。
  • 無需任何轉碼器。
  • 支持包含 H264 和 AAC 的 MP4 以及包含 VP8/VP9 和 Vorbis/Opus 的 WebM。

規範

需求條件

以下各節說明使用 DASH 將直播傳送至 YouTube 時必須遵守的規定。

Timing

YouTube DASH 端點具有被動式 HTTP 伺服器,會記錄編碼器傳送的 PUT 方法呼叫。

  • DASH 端點支援同步 TCP 連線。可依據 HTTP/1.1 重複使用連線。
  • MPD 和初始化區隔應在第一個媒體區隔的 3 秒內進行「處理」。(建議您在 MPD 中加入初始化區隔)。
  • 每個片段或 MPD 都必須使用獨立的 PUT 要求,無法一次上傳多個片段。
  • 為了改善上傳頻寬,媒體區隔的 PUT 作業可能會即時重疊。
  • 系統可以使用大約 3 秒的間隔,按順序排列。
  • MPD 和初始化區隔應至少每 60 秒更新一次 availabilityStartTimestartNumber。(如上所述,您可以將 MPD 初始化部分加入 MPD 中)。在這種情況下,一個 PUT 要求可以同時更新這兩個區隔)。

網址結構

編碼器必須在 YouTube 端點基本網址上附加字串,藉此形成 PUT 網址。您必須使用 YouTube Live Streaming API,才能建立 DASH 擷取端點。

編碼器隨後可透過 YouTube Live Streaming API,以程式輔助的方式取得端點的基準網址。如果您要手動將網址提供給編碼器,YouTube 現場直播活動使用者介面也會顯示基本網址。

附加至基準網址的字串可包含以下一組 ASCII 字元:

  • 小寫字母:a-z
  • 大寫英文字母:A-Z
  • 數字:0-9
  • 特殊字元:_ (底線)、- (連字號)、.(句號)

MPD 網址

除了上述規定之外,MPD 網址也必須以 .mpd 結尾,這樣 YouTube 伺服器就能輕鬆識別 MPD。其他區隔網址的結尾不能是 .mpd

初始化和媒體區隔網址

如果資料位於 ISO BMFF 容器中,初始化區隔網址和所有媒體區隔網址結尾都是 .mp4;如果資料位於 WebM 容器中,則結尾則是 .webm

MPD 內容

MPD 必須完整,且符合 DASH 標準。其中必須包含下列任一種元素的其中一個。這份清單列出了 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$ 產生媒體區隔網址。(startNumber 屬性可識別指派給第一個媒體區隔的編號)。

初始化區隔長度

初始化區隔不得大於 100 KB。(通常,「初始化」區隔要小得多)。如果 MPD 內含初始化區隔,則包含該區段的 data: 網址不得超過 100 KB。

編碼器輸出

初始化片段和媒體區隔必須構成多重的 ISO BMFF 或 WebM 檔案串流,且封閉式 GOP (圖片組)。

  • GOP 大小約為 2 秒,且必須小於 8 秒。
  • 多重廣告串流必須同時包含音軌和視訊軌。

其他最佳做法

加密

YouTube 支援透過 HTTPS 進行串流加密。強烈建議您使用這項功能。

MPD 初始化區隔

您可以使用 RFC 2397,使用 data: 網址直接在 MPD 中表示初始化區隔。這樣可以簡化您的串流設定,並降低初始化區隔無法對應至串流其他部分的可能性。

這個元素的 XPath 如下:

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

目標區隔時間長度

為了提高擷取效能,以及在總處理量與延遲時間之間取得良好平衡,您的媒體片段長度應介於 1 到 5 秒之間。強烈建議您使用以下兩個元素來傳遞 MPD 中各區隔的目標時間長度:

  • /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] 毫秒間的隨機時間並重試要求。

請注意,編碼器要被指示失敗,

HTTP 回應代碼

以下各節說明 YouTube 透過 DASH 傳送的區段傳回的回應代碼。

200 (確定)

HTTP 200 (OK) 回應表示 YouTube 伺服器收到預期的作業並成功處理。

202 (Accepted)

HTTP 202 (已接受) 對任何 PUT 或 POST 作業做出回應,表示作業為非預期,可接受延遲處理。不過,由於延遲作業可以成功或失敗,因此回應並不保證 YouTube 能夠成功處理作業。

這種回應最常發生在未依序傳送區隔的情況下。通常在收到上述區段後,YouTube 就可以正確處理系統接受的區段,而不需要重新傳送片段。

例如,在下列任一情況中,YouTube 會傳回 202 回應:

  • 在 MPD 之前接收初始化片段。
  • 會在 MPD 和初始化區隔之前接收媒體片段。
  • 媒體片段是在較早的區隔之前收到,例如在區隔 2 之前收到的區隔 3。

不過,202 回應也表示,如果 YouTube 收到 POST 或 PUT 要求時無法完整驗證識別碼,項目 ID 就會不正確。例如,發生這種狀況時,YouTube 會在收到 MPD 前接收到初始化區段,但初始化區段無效。在這種情況下,YouTube 會接受初始化區段並傳回 202,然後在收到 MPD 後判定該區段是否有效。如要避免這種情況,請在 MPD 中加入初始化區隔

400 (錯誤要求)

HTTP 400 (錯誤要求) 回應表示發生下列其中一項問題:

  • URL 格式錯誤
  • 訊息過大 (超過 10MB)
  • 無法剖析 MPD
  • MPD 中的初始化區段損毀

401 (未經授權)

HTTP 401 (未經授權) 回應表示 YouTube DASH 端點的基礎網址已損毀或過期。

405 (不允許的方法)

HTTP 405 (不允許的方法) 回應表示已傳送 POSTPUT 以外的要求。

409 (Conflict)

收到任何 PUT 或 POST 作業的 HTTP 409 (衝突) 回應,表示 YouTube 無法處理要求。舉例來說,如果要求者傳送了多個媒體片段,但 YouTube 仍沒有 MPD、初始化區段或兩者皆有,就會發生這類回應。在這個範例中,編碼器必須重新傳送 MPD 和初始化區隔,然後重試失敗的要求。

500 (內部伺服器錯誤)

HTTP 500 (內部伺服器錯誤) 回應表示伺服器無法處理要求。對於這個錯誤,我們建議您使用指數輪詢重試要求。

範例

網址序列

下方的網址序列顯示將透過 DASH 傳送內容的一系列 PUT 要求。這個序列假設 YouTube DASH 端點的基準網址如下:

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

序列會顯示個別傳送的 MPD 和初始化區隔。不過,您可以直接在 MPD 中表示初始化區隔,建議您採用這個做法。此外,MPD 和初始化區隔應至少每隔 60 秒更新一次。因此,這些區隔內的網址會再次出現在這個序列中,後面接著網址,以便顯示更多媒體區隔。

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 中內嵌的初始化區隔。建議您採用這種方式嵌入初始化區隔,不要另外傳送。

此範例符合將 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="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 範例沒有嵌入的初始化區隔,也符合 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 中內嵌的初始化區隔。建議您採用這種方式嵌入初始化區隔,不要另外傳送。

此範例符合 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"
    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 範例沒有內嵌初始化區隔,也符合 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 不一定使用 Atom,但這只是一個符合規定的範例。具體來說,系統會同時呈現音訊和視訊軌。

Media

下圖顯示多重格式 ISO BMFF 媒體片段樣本的版面配置。YouTube 不一定會使用所有 Atom,但這只是一個符合規定的範例。具體來說,系統會同時呈現音訊和視訊軌。您可以將這些片段附加到「初始化」區隔,以便產生有效的完整 ISO BMFF 串流。

已知限制

RTMP 和 DASH 擷取

你無法將 RTMP 和 DASH 擷取內容混用到 YouTube。這適用於在廣播期間切換兩者、使用一種做為主要擷取方法,另一種用於備份擷取。