HLS詳解(看這個就夠了)

HLS概述

HLS是HTTP Live Streaming的簡稱,是蘋果公司提出的基於HTTP的流媒體網絡傳輸協議,它的基本原理也是服務端把文件或媒體流按照不同的碼率切分成一個個小片段進行傳輸,客戶端在播放碼流時,可以根據自身的帶寬及性能限制,在同一視頻內容的不同碼率的備用源中,選擇合適碼率的碼流進行下載播放。在傳輸會話開始時,客戶端首先需要下載描述不同碼流元數據的M3U8索引文件。

官方定義

從概念上講,HTTP Live Streaming由三個部分組成:服務器組件,分發組件和客戶端軟件。

在典型配置中,硬件編碼器接受音頻視頻輸入,將其編碼爲HEVC視頻和AC-3音頻,然後輸出片段化的MPEG-4文件或MPEG-2傳輸流。然後,軟件流分段器將流分成一系列簡短的媒體文件,這些文件放在Web服務器上。分段器還創建並維護一個包含媒體文件列表的索引文件。索引文件的URL在Web服務器上發佈。客戶端軟件讀取索引,然後按順序請求列出的媒體文件並顯示它們,而各段之間沒有任何暫停或間隙。
HLS流程
服務器組件(Server Component)
服務器組件負責獲取媒體的輸入流並對其進行數字編碼。它以適合交付的格式封裝它們,並準備封裝的媒體以進行分發。
對於現場事件,服務器需要媒體編碼器(可以是現成的硬件),以及一種將編碼的媒體拆分爲片段並將其保存爲文件的方法,該方法可以是諸如由Microsoft提供的媒體流分段器之類的軟件。 Apple或集成第三方解決方案的一部分。

分配組件(Distribution Component)
分發系統是Web服務器或Web緩存系統,可通過HTTP將媒體文件和索引文件傳遞給客戶端。不需要自定義服務器模塊即可交付內容,並且通常在Web服務器上只需要很少的配置。要實際部署HTTP Live Streaming,您需要爲瀏覽器或客戶端應用程序創建HTML頁面以充當接收器。您還需要使用Web服務器,以及將實時流編碼爲包含HEVC或H.264視頻以及AAC或AC-3音頻的分段MPEG-4媒體文件的方式。

客戶端軟件(Client Software)
客戶端軟件負責確定要請求的適當媒體,下載這些資源,然後重新組合它們,以便可以將媒體連續地呈現給用戶。客戶端軟件包含在iOS 3.0和更高版本中以及安裝了Safari 4.0或更高版本的計算機上。

客戶端軟件首先使用標識流的URL獲取索引文件。索引文件又指定可用媒體文件,解密密鑰以及任何可用備用流的位置。對於選定的流,客戶端按順序下載每個可用的媒體文件。每個文件包含流的連續段。一旦下載了足夠數量的數據,客戶端便開始向用戶展示重組後的流。

客戶端負責獲取所有解密密鑰,驗證或提供允許驗證的用戶界面以及根據需要解密媒體文件。

此過程將繼續進行,直到客戶端在索引文件中遇到EXT-X-ENDLIST標記爲止。如果不存在EXT-X-ENDLIST標記,則索引文件是正在進行的廣播的一部分。在正在進行的廣播期間,客戶端會定期加載索引文件的新版本。客戶端在更新的索引中查找新的媒體文件和加密密鑰,並將這些URL添加到其隊列中。

項目 釋義
Audio/Video inputs 視頻源可以是任意格式,可以是離線文件或實時碼流
Media encoder 將視頻源中的視頻數據轉碼到目標編碼格式(H264)的視頻數據
stream segmenter 對編碼後的視頻進行切片,視頻會被轉換成HLS格式的視頻(即TS和m3u8文件
index file 索引文件,後綴以".m3u8"結尾的文件
ts 緩存內容,後綴以".ts"結尾的文件
HTTP 傳輸協議

優劣性

優點:

  1. 基於HTTP傳輸,防止防火牆屏蔽;
  2. 碼率自適應;
  3. 服務器易於拓展,易於http做負載均衡;

缺點:

  1. 時延較長(10秒左右),對時延敏感慎用;
  2. 對服務器內存要求高;

格式解析

項目 釋義
網絡協議 HTTP
封裝格式 MEPG-2 TS
編碼格式 視頻編碼格式爲H.264,音頻編碼格式爲MP3、AAC、AC-3或EC-3
索引文件 M3U8

HLS文件

HLS文件

項目 釋義
index file 主索引,後綴以".m3u8"結尾的文件
Alternate-A index file 子索引,後綴以".m3u8"結尾的文件
ts 實際緩存內容,後綴以".ts"結尾的文件

HLS有兩級索引

  1. 第一級索引存放的是不同碼率的HLS源的M3U8地址,也就是二級索引文件的地址。
  2. 第二級索引則記錄了同一碼率下TS切片序列的下載地址。

客戶端獲取一級M3U8文件後,根據自己的帶寬,去下載相應碼率的二級索引文件,然後再按二級索引文件的切片順序下載並播放TS文件序列。

HLS存儲目錄截圖如下:

HLS存儲文件目錄

playlist(m3u8)介紹

HLS中的playlist是一個UTF-8編碼的文本文件,其中包含了URL和描述性標籤。一個常規的playlist如下所示:

#EXT-X-VERSION:3
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:1
 
# Old-style integer duration; avoid for newer clients.
#EXTINF:10,
http://media.example.com/segment0.ts
 
# New-style floating-point duration; use for modern clients.
#EXTINF:10.0,
http://media.example.com/segment1.ts
#EXTINF:9.5,
http://media.example.com/segment2.ts
#EXT-X-ENDLIST

其中以’#‘打頭的行都是標籤,HLS標準規定對於標準中未定義的標籤,可以直接忽略;也就是說’#'也可以作爲註釋行。這裏說明下上面M3U8文件的構成:

  1. #EXT-X-VERSION:表示協議的版本號,而且每個M3U8中只能出現一次該標籤。對於具體版本號的定義,可以參考標準的第7節。
  2. #EXTM3U:作爲M3U文件的標識符,可以用於文件類型識別,這是必須的字段。
  3. #EXT-X-TARGETDURATION:表示最長分片的時長,這是必須的字段。
  4. #EXT-X-MEDIA-SEQUENCE:表示playlist文件中第一個分片的序列號(整數值)。如果M3U8文件中沒有該字段,則playlist中第一個分片的序列號必須是0。
  5. #EXTINF:表示下一個分片的時長。對於每個分片,必須有該字段。 對於#EXT-X-VERSION小於3的情況下,duration必須是整數;其他情況下duration可以是浮點數和整數。title是一個可選字段,僅用於增強可讀性。
  6. #EXT-X-ENDLIST:該字段表示分片結束,不會在playlist文件中添加新的分片。

上面介紹的是最常見的playlist,還有一種playlist,僅包含播放節目列表信息,在HLS中稱爲master playlist,也是我們上圖描述二級索引的結構,其示例如下:

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=1280000,AVERAGE-BANDWIDTH=1000000, RESOLUTION=720x480
http://example.com/low.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=2, BANDWIDTH=2560000,AVERAGE-BANDWIDTH=2000000, RESOLUTION=1080x720
http://example.com/mid.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=3, BANDWIDTH=7680000,AVERAGE-BANDWIDTH=6000000, RESOLUTION=1920x1080
http://example.com/high.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=4, BANDWIDTH=65000,CODECS="mp4a.40.5"
http://example.com/audio-only.m3u8

其中包含的標籤說明如下:

  1. #EXT-X-STREAM-INF:用於標識一個Variant Stream,這是由一系列的Redition組成的。該標籤的屬性列表中包含了Variant Stream的描述信息。例如:

    • BANDWIDTH表示Variant Stream中的峯值比特率,單位bits/s。
    • AVERAGE-BANDWIDTH表示Variant Stream中的平均比特率,單位bits/s。
    • CODECS包含Variant Stream中音視頻編碼格式相關的信息,比如上面的"mp4a.40.5"。
    • RESOLUTION包含Variant Stream中對應視頻流的分辨率。
    • FRAME-RATE表示Variant Stream中的視頻幀率。
  2. M3U8中還有一個標籤需要關注下,EXT-X-PLAYLIST-TYPE。該標籤只有兩個值:EVENTVOD。EVENT指的是分片工具只能在M3U8末尾添加新的分片的信息,但不能刪除老的分片,通常比較適用於直播+錄播的情況(既要提供給客戶端點播功能,也要對實時場景進行錄製,直播完成之後EVENT就自然退化爲VOD)。但是對於M3U8中存在#EXT-X-ENDLIST標籤時,可以忽略EXT-X-PLAYLIST-TYPE。

  3. 還有一種情況,如果M3U8中不存在#EXT-X-ENDLIST以及EXT-X-PLAYLIST-TYPE標籤,則服務器端可以任意更新playlist內容。

HLS playlist(m3u8)格式詳解

可參考:
https://www.cnblogs.com/tocy/p/hls-playlist-example.html
https://blog.csdn.net/weixin_33735077/article/details/86362702
https://blog.csdn.net/weixin_38451161/article/details/101033178

播放模式

點播VOD

特點就是當前時間點可以獲取到所有index文件和ts文件,二級index文件中記錄了所有ts文件的地址。這種模式允許客戶端訪問全部內容。上面的例子中就是一個點播模式下的m3u8的結構。

Live 模式

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

客戶端在播放VOD模式的視頻時其實只需要下載一次一級index文件和二級index文件就可以得到所有ts文件的下載地址,除非客戶端進行比特率切換,否則無需再下載任何index文件,只需順序下載ts文件並播放就可以了。但是Live模式下略有不同,因爲播放的同時,新ts文件也在被生成中,所以客戶端實際上是下載一次二級index文件,然後下載ts文件,再下載二級index文件(這個時候這個二級index文件已經被重寫,記錄了新生成的ts文件的下載地址),再下載新ts文件,如此反覆進行播放。

參考鏈接:
https://www.jianshu.com/p/426425cad08a
https://www.jianshu.com/p/32417d8ee5b6
https://www.jianshu.com/p/6de22b88dc73
https://blog.csdn.net/u011857683/article/details/84863250
https://blog.csdn.net/qiandublog/article/details/53434081
https://blog.csdn.net/weixin_38451161/article/details/101033178
https://www.cnblogs.com/tocy/p/hls-playlist-example.html

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