透過 DASH 提交 YouTube 直播內容

這份文件提供有關如何透過 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 中)。在這種情況下,一個 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] 毫秒之間等待隨機間隔,然後重試要求。
  4. 其他

請注意,如果重複失敗,應該通知編碼器業者,因為這樣會對應到失敗的廣播。

HTTP 回應代碼

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

200 (確定)

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

202 (Accepted)

對任何 PUT 或 POST 作業 (已接受) 的 HTTP 202 (已接受) 回應,即表示未預期作業遭到延遲處理。不過,延遲作業可能成功或失敗,因此回應不保證 YouTube 確實能成功處理這項作業。

這種回應最常出現在沒有依序放送區段的情況下。通常 YouTube 收到上述區段後,就能正確處理已接受的區段,您不需要重新傳送該區段。

舉例來說,在下列情況中,YouTube 可能會傳回 202 回應:

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

不過,202 回應可能指出如果 YouTube 無法於收到 POST 或 PUT 要求後完整驗證 ID 時,則可能表示項目 ID 不正確。例如 YouTube 在收到 MPD 之前收到並接受初始化區段時,但初始化片段變成無效的情況。在這種情況下,YouTube 會接受初始化片段並傳回 202,然後判斷收到 MPD 之後該片段是否有效。如要避免這種情況,請在 MPD 中加入初始化區段

400 (錯誤的要求)

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

  • 網址格式錯誤。
  • 貼文過大 (> 10 MB)。
  • 無法剖析 MPD。
  • MPD 中的初始化區段毀損。

401 (未授權)

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

405 (不允許的方法)

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

409 (Conflict)

若 HTTP 409 (衝突) 回應任何 PUT 或 POST 作業,代表 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 資料網址中的嵌入式初始化片段。建議您以這種方式嵌入「初始化」區段,而不要個別傳送。

此範例符合 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

下列 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 串流的部分最多,但不包含第一個叢集。

媒體

下列顯示 WebM 媒體區段範例的版面配置。其中包含單一 WebM 叢集。與 ISO BMFF 串流一樣,在一組叢集前面的初始化區段應產生有效的 WebM 串流。

ISO BMFF 片段

含嵌入式初始化片段的 MPD

下列範例 MPD 含有 RFC 2397 資料網址中的嵌入式初始化片段。建議您以這種方式嵌入「初始化」區段,而不要個別傳送。

這個範例符合 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

下列範例 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 不一定會使用原子,但這是符合規範的範例。尤其是音軌和視訊。

媒體

下圖顯示多工 ISO BMFF 媒體區段範例的版面配置。YouTube 不一定會使用所有原子,但此範例為符合標準。尤其是音軌和視訊。您可以將一系列的這些片段附加至初始化區段,產生有效且完整的多重 ISO BMFF 串流。

已知限制

RTMP 和 DASH 擷取

您無法將 RTMP 和 DASH 內容攝入至 YouTube。這適用於在直播期間切換這兩種格式,或將其中一種做為主要內容攝入方式,或做為備份內容攝入。