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

本文說明如何使用 HTTP 即時串流 (HLS) 通訊協定,透過編碼器在 YouTube 上串流播放即時資料。本文適用於想在產品中新增 HLS 擷取支援功能的編碼器供應商。如果內容品質和解析度要求較高,但延遲時間相對較長,則適合使用 HLS 擷取功能。如需 YouTube 直播支援的各種內容攝入通訊協定簡要比較,請參閱「YouTube 直播內容攝入通訊協定比較」。

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

每個媒體片段代表一小段實際的多媒體內容,長度介於一到四秒。每個媒體播放清單都會說明如何以正確的串流順序重新組裝媒體片段。

媒體格式規定

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 Live Streaming 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= 參數值,以免串流損毀。

完成 HTTP 即時串流內容攝入網址

使用任一方法取得的網址都是不完整的範本,結尾都會是空白的 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。
    • 支援 HEVC 格式的 HDR 內容 (請參閱 HDR 需求條件)。
    • 支援的畫面更新率最高可達 60 fps。
    • 僅支援封閉式 GOP。
    • 支援的音訊轉碼器為 AAC,且僅支援單音軌音訊。
    • 如要瞭解媒體片段的建議時間長度 (1 到 4 秒),請參閱下節。媒體片段的長度不得超過 5 秒。
    • 媒體片段只能在 TLS/SSL 層中以 HTTPS 加密。 系統不支援其他加密機制。

媒體片段時間長度

我們希望 HLS 擷取功能用於需要高畫質和高解析度的優質內容。HTTP 即時串流擷取是以片段為基礎,因此延遲時間通常會比 RTMP 和 WebRTC 擷取長。

建議媒體片段長度為 1 到 4 秒,因為媒體片段越小,延遲時間就越短,但代價是重新緩衝率較高,編碼效率較低。如上一節所述,媒體片段長度不得超過 5 秒。

位元速率

YouTube 說明中心提供位元率設定指南。

請注意,與 H.264 相比,HEVC 通常可在��同影片品質下,將資料壓縮率提高 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)

如果 YouTube 伺服器收到預期的 PUT 或 POST 要求,並順利處理完畢,就會傳回 HTTP 200 (OK) 回應。

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

202 (Accepted)

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

400 (錯誤的要求)

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

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

HTTP 401 (未授權) 回應表示 YouTube HLS 端點基本網址中的 cid 參數已損毀或過期。用戶端應更新 cid 參數,才能繼續操作。

405 (不允許的方法)

HTTP 405 (不允許使用的方法) 回應表示要求不是 POST、PUT 或 DELETE 要求。

500 (內部伺服器錯誤)

HTTP 500 (Internal Server Error) 回應表示伺服器無法處理要求。如果發生這個錯誤,建議���使用指數輪詢重試要求。