HLS 編解碼協議詳解

1 概述

HTTP Live Streaming(HLS)是一個由蘋果公司提出的基於 HTTP 的流媒體網絡傳輸協議。是蘋果公司 QuickTime X 和 iPhone 軟件系統的一部分。它的基本原理是在服務端把文件或媒體流分成許多小塊的基於 HTTP 的文件或媒體流,客戶端在播放碼流時,可以根據自身的帶寬及性能限制,在同一視頻內容的不同碼率的備用源中,選擇合適碼率的碼流進行下載播放。在傳輸會話開始時,客戶端首先需要下載描述不同碼流元數據的 M3U8 索引文件,用於尋找可用的媒體流。

與基於 UDP 的 實時傳輸協議(RTP)協議不同,HLS 只請求基本的 HTTP 報文,因此可以穿過任何允許 HTTP 數據通過的防火牆或代理服務器。這也便於使用傳統的 HTTP 服務器作爲源,並廣泛使用基於 HTTP 的內容分發網絡來傳輸媒體流。

2 HLS 協議簡介

HLS 協議格式可簡單歸納如下:

網絡協議: HTTP

封裝格式: TS

編碼格式: 視頻編碼格式 -> H.264 音頻編碼格式 -> MP3、AAC、AC-3

索引文件: M3U8

需要說明的是,目前已有廠家實現了 H.265 的 HLS 編碼。在封裝層面,除了 MPEG-2 TS 封裝外,在 WWDC2016 上,蘋果宣佈了HLS對分段 MP4(fMP4)文件字節尋址的支持,爲 HLS 向 MPEG-DASH 的兼容提供了可能。

根據媒體流的生成及流向,HLS 的結構可劃分爲如下幾個部分:

image

  1. Audio/Video inputs 源可以是任意格式,可以是離線文件或實時碼流。
  2. Server 接收到視頻源後,Media encoder 將源視頻轉碼成 HLS 支持的編碼格式和封裝格式,根據需求可輸出多個碼率分別送至 Stream segmenter。
  3. 在 segmenter 中被切分成指定大小或時間長度的 TS 切片,並生成索引文件 M3U8。
  4. Distribution 是一個 HTTP 文件服務器,負責將流媒體文件推送出去或響應客戶端的請求。
  5. 客戶端只要訪問一級 M3U8 文件路徑就能自動播放 HLS 視頻流了。

那麼,M3U8 到底是個什麼文件呢?

M3U8 文件其實就是以 UTF-8 編碼的 M3U 文件,該文件本身不能播放,只是用於存放待播放視頻流的基本信息。下圖表示了 M3U8 文件的結構。

image

HLS 有兩級索引,第一級索引存放的是不同碼率的 HLS 源的 M3U8 地址,也就是二級索引文件的地址;第二級索引則記錄了同一碼率下 TS 切片序列的下載地址。客戶端獲取一級 M3U8 文件後,根據自己的帶寬,去下載相應碼率的二級索引文件,然後再按二級索引文件的切片順序下載並播放 TS 文件序列。

一個典型的一級索引文件如下:

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=500000, RESOLUTION=720x480
mid_video_index.M3U8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=800000, RESOLUTION=1280x720
wifi_video_index.M3U8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=3000000, CODECS="avc1.4d001e,mp4a.40.5", RESOLUTION=1920x1080
h264main_heaac_index.M3U8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=64000, CODECS="mp4a.40.5"
aacaudio_index.M3U8

其中,

#EXTM3U

格式標籤,標明該文件是一個 Extended M3U 播放列表文件

#EXT-X-STREAM-INF

特定流標籤,指示了該流的格式信息:PROGRAM-ID 節目 ID,一般不用考慮;BANDWIDTH:指定流的帶寬;RESOLUTION:視頻分辨率;如果存在音頻分級,則需指定音頻的編碼格式 CODECS,如上例中的最後兩項。

#EXT-X-STREAM-INF下面緊接的一行,如mid_video_index.m3u8則是對應流的二級索引文件地址,通過下載該二級索引文件,便可得到媒體切片的信息。

客戶端可以自己判斷自己的現行網絡帶寬,來決定播放哪一個視頻流。也可以在網絡帶寬變化的時候平滑切換到和帶寬匹配的視頻流。

二級索引文件格式按照播放模式分類如下:

(1) VOD 模式

點播 VOD 的特點就是當前時間點可以獲取到所有 ts 文件,二級索引文件中記錄了所有 ts 文件的地址。這種模式允許客戶端訪問全部內容。

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-VERSION:3
#EXTINF:9.009,
http://media.example.com/first.ts
#EXTINF:9.009,
http://media.example.com/second.ts
#EXTINF:3.003,
http://media.example.com/third.ts
#EXT-X-ENDLIST

仍然是以#EXTM3U開頭

#EXT-X-TARGETDURATION: 表示切片的最大時長,單位是秒。#EXT-X-TARGETDURATION:10 表示列表中表示的每個切片時長不超過 10 秒。

#EXT-X-VERSION:表示協議兼容性版本。

#EXTINF:切片的實際時長,若要求取整,則其數值不能大於 EXT-X-TARGETDURATION 的值。

http://media.example.com/first.ts:對應的切片文件(路徑),可以是絕對路徑,也可以是相對路徑。

#EXT-X-ENDLIST:表示整個碼流的結束,不再向後附加新的切片列表。

(2) Live 模式

Live 模式就是實時生成 M3U8 和 ts 文件。它的索引文件一直處於動態變化的,播放的時候需要不斷下載二級索引文件,以獲得最新生成的 ts 文件播放視頻。如果一個二級索引文件的末尾沒有 #EXT-X-ENDLIST 標誌,說明它是一個 Live 視頻流。

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:2680
 
#EXTINF:7.975,
https://priv.example.com/fileSequence2680.ts
#EXTINF:7.941,
https://priv.example.com/fileSequence2681.ts
#EXTINF:7.975,
https://priv.example.com/fileSequence2682.ts

#EXT-X-MEDIA-SEQUENCE:媒體序列號,表示出現在當前 M3U8 文件中的第一個 Segment 的序列號。

Live 模式的 M3U8 一般用於直播,列表中的文件數有限制,推薦配置中是 3 個,服務端會實時更新該列表,刪除最開始的 Segment,並向後面添加新生成的 Segment。因此,這種模式下,當網絡帶寬不足時,客戶端來不及下載新的 M3U8 和對應的切片文件,會導致切片丟失,播放卡頓。

2.1. HLS 優勢

  1. HLS 協議本身實現了碼率自適應,不同帶寬的設備可以自動切換到最適合自己碼率的視頻播放。
  2. 解決 RTMP 協議存在的一些問題。比如 RTMP 協議不使用標準的 HTTP 接口傳輸數據,所以在一些特殊的網絡環境下可能被防火牆屏蔽掉。但是 HLS 由於使用的 HTTP 協議傳輸數據,不會遇到被防火牆屏蔽的情況。
  3. RTMP 是一種有狀態協議,很難對視頻服務器進行平滑擴展,因爲需要爲每一個播放視頻流的客戶端維護狀態。而 HLS 基於無狀態協議(HTTP),客戶端只是按照順序使用下載存儲在服務器的普通 TS 文件,做負責均衡如同普通的 HTTP 文件服務器的負載均衡一樣簡單。

2.2. HLS 劣勢

HLS 存在延遲過大的劣勢。採用 HLS 直播的視頻流延時一般在 10 秒以上,使用推薦配置時延遲大概在 30s,而 RTMP 直播的延遲最低可達到 3、4 秒,因此,在對實時性要求較高的場合,如互動直播,就要慎用 HLS 了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章