透過 HTTP 即時串流提交 YouTube 直播內容

本文件說明如何使用 HTTP 即時串流 (HLS) 通訊協定,透過編碼器在 YouTube 上串流直播資料。本文件適用於想在產品中加入 HLS 攝入功能的編碼器供應商。如果需要高品質和高解析度的高級內容,且可以接受較長的延遲時間,則 HLS 攝入功能是理想的選擇。如要簡要比較 YouTube 直播串流支援的不同攝入通訊協定,請參閱「YouTube 直播串流攝入通訊協定比較」。

如要使用 HLS 串流播放即時資料,編碼器應使用 HTTP PUTPOST 要求,將一系列媒體播放清單和媒體區段傳送至 YouTube 的 HLS 端點。從編碼器的角度來看,YouTube HLS 端點似乎是被動的 HTTP 伺服器。

每個媒體片段代表串流內容的短暫片段,片段長度介於 1 到 4 秒之間。每個媒體播放清單都會說明如何以正確的串流順序重新組合媒體片段。

媒體格式規定

YouTube HLS 攝入功能對影片和音訊內容有以下規定:

  • 影片和音訊必須以 M2TS 格式混合。
  • 支援的視訊轉碼器為 H.264 和 HEVC。
  • 支援最高 60 fps 的畫面更新率。
  • 僅支援封閉式 GOP。
  • 系統支援的音訊編碼器為 AAC,且僅支援單軌音訊。

詳情請參閱「媒體區隔」一節。

高動態範圍

系統支援使用 HEVC 編解碼器的高動態範圍 (HDR) 影片,並且有下列其他規定:

  • 支援的色彩標準為 10 位元 PQ 和 HLG,並且亮度不固定。具體來說:
    • 色度格式必須為 YUV 4:2:0 10 位元。
    • 傳遞函數必須為 PQ (也稱為 SMPTE ST 2084) 或 HLG (也稱為 ARIB STD-B67)。
    • 原色必須為 Rec. 2020。
    • 矩陣係數必須是 Rec. 2020 非恆亮。
  • 系統支援有限範圍 (或 MPEG 範圍) 和全範圍 (或 JPEG 範圍) 的取樣值。請務必根據內容使用的範例值範圍設定範圍。建議使用範圍有限的範例值。

取得 HLS 攝入網址

從 YouTube API 取得 HLS 內容擷取網址

如要取得完整的攝入網址,編碼器可以使用 YouTube 直播串流 API,透過以下屬性插入 liveStream 資源

"cdn": {
  "ingestionType": "hls",
  "frameRate": "variable",
  "resolution": "variable"
}

在 API 回應中,cdn.ingestionInfo.ingestionAddress 欄位會指定主要擷取網址,而 cdn.ingestionInfo.backupIngestionAddress 欄位則會指定備用擷取網址。詳情請參閱 liveStreams 資源的說明文件。

從 YouTube 創作者工作室取得 HLS 攝入網址

YouTube 創作者工作室網頁介面中,創作者點選「建立串流」後,YouTube 會顯示由英數字元和連字號組成的「串流金鑰」。這個密鑰可識別創作者和 YouTube 串流。

您可以使用這個串流金鑰建構 HLS 網址,如下所示:

https://a.upload.youtube.com/http_upload_hls?cid=$STREAM_KEY&copy=0&file=

... 其中 $STREAM_KEY 是網頁介面中顯示的串流金鑰。例如:https://a.upload.youtube.com/http_upload_hls?cid=abcd-efgh-ijkl-mnop-qrst&copy=0&file=

為提高可靠性,您可以將擷取內容的備用第二份傳送至這個備用網址:

https://b.upload.youtube.com/http_upload_hls?cid=$STREAM_KEY&copy=1&file=

請注意,備份網址與主要網址有兩個不同之處:主機名稱和 copy= 參數都已變更。備份擷取作業必須傳送與主要擷取作業不同的 copy= 參數值,以免流程遭到損毀。

完成 HLS 攝入網址

使用這兩種方法取得的網址都是不完整的範本,每個網址結尾都會附有空白的 file= 查詢參數。為了建立最終到達網址,編碼器必須在網址結尾附加媒體播放清單或媒體區段的檔案名稱,藉此完成 file= 參數。

file= 參數的值須符合下列規則:

  • 編碼器可使用英數字元、底線、正斜線、連字號和半形句號建立媒體播放清單或媒體區段檔案名稱,但不支援其他字元。
  • 編碼器不得對檔案名稱進行網址編碼。
  • 編碼器可能會在檔案名稱中加入相對或絕對路徑元件,但這並非必要。如果編碼器在媒體區段檔案名稱中加入路徑元件,則必須在對應的播放清單項目中參照相同的路徑。

HLS 通訊協定規定

編碼器傳送的媒體播放清單和媒體區段必須符合 HTTP 即時串流第 2 版規格

HLS 規格定義了兩種播放清單:媒體播放清單和主播放清單。由於 YouTube 會將串流內容轉碼為不同的解析度和位元率,因此編碼器不必將不同位元率的內容傳送至 YouTube。因此,YouTube 僅支援媒體播放清單來擷取 HLS,而主要播放清單會遭到忽略。(主播放清單會提供一組變化版本串流,每個變化版本都會描述相同內容的不同版本)。

編碼器必須符合下列條件:

  • 傳送一條編碼串流,且該串流的解析度必須是您要提供給使用者的最高解析度 (單一解析度和編解碼器)。
  • 將音訊和視訊進行多路複用。
  • 使用 HTTPS 和持續連線來處理所有要求。

以下各節將進一步說明媒體播放清單和媒體區隔的具體規定。

媒體播放清單

媒體播放清單包含媒體區段清單,可連接起來代表可解碼的連續多媒體串流。媒體播放清單會告知伺服器應預期哪些媒體片段,以及如何在重新組合的串流中正確排序。

需求條件

  • 媒體播放清單檔案名稱結尾必須為 .m3u8.m3u

  • 為串流傳送的第一個媒體播放清單必須從序號 0 開始,且序號必須單調遞增。

  • EXT-X-MEDIA-SEQUENCE 標記必須識別播放清單中列出的首個媒體區段序號。

  • 媒體播放清單中不得包含超過五個待處理片段。如果伺服器尚未收到或確認收到某個區段,則該區段為未結。

    除了未結案的片段,每個媒體播放清單也應納入一些已認可的片段。這樣一來,如果伺服器端遺失了媒體播放清單,就比較不會跳過某個區段。舉例來說,您最多可在每個媒體播放清單中加入兩個已確認的區段,以及最多五個未確認的區段。

    請注意,伺服器會在上傳媒體區段時,傳回 200 (OK) 或 202 (Accepted) 回應,藉此確認已收到該區段。202 回應表示伺服器在播放清單識別該區段之前,就已收到該區段。

  • 每個媒體區隔傳送更新的媒體播放清單,這樣在媒體播放清單遺失時,伺服器就能快速復原。

  • 當伺服器確認已收到媒體區段時,您可以增加 EXT-X-MEDIA-SEQUENCE 標記值,避免媒體播放清單變得過長。舉例來說,如果伺服器已確認收到前九個媒體區段,下一個媒體播放清單可能會列出第八、第九和第十個媒體區段。

  • 系統不支援 EXT-X-KEYEXT-X-SESSION-KEY 標記。

範例

以下清單列出編碼器應傳送的檔案範例:

Media Playlist file with seqnum #0
Media Segment file #0
Media Playlist file with seqnum #0-#1
Media Segment file #1
Media Playlist file with seqnum #0-#2
Media Segment file #2
Media Playlist file with seqnum #1-#3
Media Segment file #3
...

以下範例顯示在直播影片串流期間傳送的媒體播放清單。由於範例來自串流的中間,因此 EXT-X-MEDIA-SEQUENCE 標記的值不為零。

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:2680

#EXTINF:3.975,
fileSequence2680.ts
#EXTINF:3.941,
fileSequence2681.ts
#EXTINF:3.975,
fileSequence2682.ts

媒體區段

以下清單列出媒體區隔的必要條件:

  • 檔案名稱
    • 網址中的媒體區段檔案名稱必須使用 .ts 副檔名,且必須與播放清單中的檔案名稱相符。
    • 媒體區段檔案名稱在編碼器重新啟動和串流重新啟動時不得重複。
  • 格式
    • 媒體片段必須採用 M2TS 格式,且應自行初始化。
    • 每個 M2TS 區段都必須包含單一 MPEG-2 程式。
    • M2TS 片段必須包含 PAT 和 PMT,且片段中前兩個傳輸串流封包應為 PAT 和 PMT。
  • 內容
    • 影片和音訊必須經過混合。
    • 支援的視訊轉碼器為 H.264 和 HEVC。
    • 支援 HDR 和 HEVC (請參閱 HDR 需求條件)。
    • 支援最高 60 fps 的畫面更新率。
    • 僅支援封閉式 GOP。
    • 系統支援的音訊轉碼器為 AAC,且僅支援單軌音訊。
    • 建議媒體片段的長度介於 1 到 4 秒之間,如後續章節所述。媒體區段的長度不得超過 5 秒。
    • 媒體片段只能在 TLS/SSL 層中使用 HTTPS 加密。不支援其他加密機制。

媒體區段時間長度

我們預期 HLS 攝入功能會用於需要高品質和高解析度的高級內容。由於 HLS 攝取作業是根據片段進行,因此通常比 RTMP 和 WebRTC 攝取作業的延遲時間更長。

我們建議的媒體片段長度為 1 到 4 秒,因為較短的媒體片段可縮短延遲時間,但代價是重讀率會提高,且編碼效率會降低。如前文所述,媒體片段長度不得超過 5 秒。

位元速率

YouTube 說明中心提供比特率設定的規範。

請注意,在相同的影片品質下,HEVC 通常可比 H.264 壓縮 25% 至 50% 的資料。因此,建議範圍下限的位元率值可搭配 HEVC 使用,以節省頻寬,這對 4K 內容特別有用。

其他需求

  • 編碼器應使用以下語法設定 HTTP 要求中的 User-Agent 標頭,其中包含製造商名稱、型號名稱和版本:

    User-Agent: <manufacturer> / <model> / <version>
    

隱藏式輔助字幕

HLS 擷取功能支援兩種隱藏式輔助字幕傳送選項:

  • 使用個別的 HTTP POST 要求傳送隱藏式輔助字幕。這項做法適用於所有 HLS 攝入內容。
  • 內嵌式 608/708 隱藏式輔助字幕適用於使用 H264 視訊轉碼器的 HLS 攝入內容,但不適用於使用 HEVC 視訊轉碼器的攝入內容。詳情請參閱 YouTube 說明中心的即時字幕規定

HTTP 回應代碼

以下各節說明 YouTube 在回應使用 HLS 提交的媒體片段和媒體播放清單時,所傳回的回應代碼。

200 (OK)

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

回應 DELETE 要求時,HTTP 200 (OK) 回應表示 YouTube 伺服器已收到並忽略要求。YouTube 伺服器不會要求用戶端刪除串流中的任何資源,且會忽略刪除要求。基於效能考量,YouTube 建議用戶端不要傳送 DELETE 要求。

202 (Accepted)

HTTP 202 (Accepted) 回應表示 YouTube 伺服器在收到包含該媒體片段的媒體播放清單之前,已收到該媒體片段。這會向用戶端指出,應盡快傳送包含該媒體區段的媒體播放清單,以免延遲處理該區段。請注意,如果編碼器為每個媒體區段傳送更新的媒體播放清單,就不會發生這個問題。

400 (Bad Request)

如果收到 HTTP 400 (Bad Request) 回應,表示發生下列其中一個問題:

  • 網址格式錯誤
  • 無法剖析播放清單,或含有不支援的標記
401 (未授權)

HTTP 401 (Unauthorized) 回應表示 YouTube HLS 端點的基礎網址中的 cid 參數已損毀或過期。用戶端應更新 cid 參數才能繼續。

405 (不允許的方法)

HTTP 405 (Method Not Allowed) 回應表示要求並非 POST、PUT 或 DELETE 要求。

500 (內部伺服器錯誤)

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