一. Http live streaming簡介
HTTP Live Streaming(縮寫是HLS)是一個由蘋果公司提出的基于HTTP的流媒體網(wǎng)絡傳輸協(xié)議。Http live streaming 直譯過來就是網(wǎng)絡直播流,其實就是一種流媒體解決方案,可以實現(xiàn)音視頻的直播和點播,以下簡稱hls。
hls協(xié)議基本規(guī)則(最重要的三點)
- 視頻的封裝格式是TS。
- 視頻的編碼格式為H264,音頻編碼格式為MP3、AAC或者AC-3。
- 除了TS視頻文件本身,還定義了用來控制播放的m3u8文件(文本文件)。
二.Http live streaming流程

服務端Server
服務器組件負責獲取的媒體輸入流 , 然后Media編碼后 MPEG-4(H.264 video 和 AAC audio)格式然后用硬件打包到 MPEG-2 (MPEG-2 transport stream)的傳輸流中。圖中顯示,傳輸流會經(jīng)過stream segmenter, 這里的工作是MPEG-2傳輸流會被分散為小片段然后保存為一個或多個系列的 .ts 格式的媒體文件。這個過程需要借助編碼工具來完成,比如 Apple stream segmenter。(視頻類是.ts文件,純音頻會被編碼為一些音頻小片段,通常為 ADTS頭的AAC、MP3、或者 AC-3格式。)服務端可以采用硬件編碼和軟件編碼兩種形式,其功能都是按照上文描述的規(guī)則對現(xiàn)有的媒體文件進行切片并使用索引文件進行管理。而軟件切片通常會使用 Apple 公司提供的工具或者第三方的集成工具。
Distribution
上圖中的stream segmenter也會創(chuàng)建一個索引文件,通常會包含這些ts媒體文件的一個列表,也能包含元數(shù)據(jù)。列表元素會關聯(lián)一個 URL 用于客戶端訪問,一個ts媒體文件對應一個URL。然后按序去請求并下載這個URL流。
流切片器Stream segmenter
流切片器(通常是一個軟件,一個SDK)會通過本地網(wǎng)絡從上面的媒體編碼器中讀取數(shù)據(jù),然后將著這些數(shù)據(jù)一組相等時間間隔的小媒體文件。雖然每一個片段都是一個單獨的文件,但是他們的來源是一個連續(xù)的流,切完照樣可以無縫重構(gòu)回去。
切片器在切片同時會創(chuàng)建一個索引文件(Index file),索引文件會包含這些切片文件的引用。每當一個切片文件生成后,索引文件都會進行更新。索引用于追蹤切片文件的有效性和定位切片文件的位置。切片器同時也可以對你的媒體片段進行加密并且創(chuàng)建一個密鑰文件作為整個過程的一部分。
文件切片器(相對于上面的流切片器, 就是切文件的)
如果已經(jīng)有編碼后的文件(而不是編碼流),你可以使用文件切片器,通過它對編碼后的媒體文件進行 MPEG-2 流的封裝并且將它們分割為等長度的小片段。切片器允許你使用已經(jīng)存在的音視頻庫用于 HLS 服務。它和流切片器的功能相似,但是處理的源從流替換為了文件。
客戶端client
- 索引文件PlayLists(.m3u8文件)
[圖片上傳失敗...(image-105307-1520489375893)]
如上圖所示,客戶端播放HLS視頻流的邏輯其實非常簡單,先下載一級Index file,它里面記錄了二級索引文件(Alternate-A、Alternate-B、Alternate-C)的地址,然后客戶端再去下載二級索引文件,二級索引文件中又記錄了TS文件的下載地址,這樣客戶端就可以按順序下載TS視頻文件并連續(xù)播放。
通常由切片器附帶生成,保存為 .m3u8格式,.m3u一般用于 MP3 音頻的索引文件。
主索引(Master PlayList)和 子索引(Media PlayList)
- 主索引文件也叫一級索引文件,英文叫Master PlayList。
- 子索引文件也叫二級索引文件,英文叫Media PlayList。
- 主索引只下載一次,而子索引則會不停定期的下載。
- 主索引記錄了子索引(也是一個.m3u8文件)的下載地址及視頻信息,子索引記錄了ts文件的下載地址和ts文件信息。
-
主索引有可能不存在,只有子索引,例如下面給出的第二張圖。
標準索引結(jié)構(gòu)圖

下面這些m3u8流地址可用以測試,類似的播放流地址很多,自行百度。
香港衛(wèi)視直播源:http://live.hkstv.hk.lxdns.com/live/hks/playlist.m3u8
CCTV1高清:http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8
CCTV3高清:http://ivi.bupt.edu.cn/hls/cctv3hd.m3u8
CCTV5高清:http://ivi.bupt.edu.cn/hls/cctv5hd.m3u8
CCTV5+高清:http://ivi.bupt.edu.cn/hls/cctv5phd.m3u8
CCTV6高清:http://ivi.bupt.edu.cn/hls/cctv6hd.m3u8
蘋果提供的測試源(點播):http://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear2/prog_index.m3u8
主索引(Master PlayList)
把流地址http://live.hkstv.hk.lxdns.com/live/hks/playlist.m3u8(實際上就是一個.m3u8文件的下載地址)放在瀏覽器地址欄,回車,會有一個.m3u8文件請求下載,下載完成后,用任意一個文檔編輯器打開,看到類似以下的亂七八槽的東西
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=415000
http://live.hkstv.hk.lxdns.com/live/hks/playlist.m3u8?wsSession=b76bc6a6ab0ddf454d935fd0-150329692423936&wsIPSercert=aa64bc2472e0b1bb9055e2aa4a1d744f&wsMonitor=-1
BANDWIDTH=415000指定視頻流的比特率(碼率)。
#EXT-X-STREAM-INF的下一行是子索引文件的路徑。
或者這種主索引不存在的.m3u8文件
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:671843
#EXT-X-TARGETDURATION:10
#EXTINF:10.000,
cctv5hd-671843.ts
#EXTINF:10.000,
cctv5hd-671844.ts
#EXTINF:10.000,
cctv5hd-671845.ts
#EXTINF:10.000,
cctv5hd-671846.ts
#EXTINF:10.000,
cctv5hd-671847.ts
#EXTINF:10.000,
cctv5hd-671848.ts
子索引(Media PlayList):
同下載主索引m3u8文件一樣,用瀏覽器打開主索引m3u8文件中的子索引地址
http://live.hkstv.hk.lxdns.com/live/hks/playlist.m3u8?wsSession=b76bc6a6ab0ddf454d935fd0-150329692423936&wsIPSercert=aa64bc2472e0b1bb9055e2aa4a1d744f&wsMonitor=-1
下載下來子索引m3u8文件,打開后如下
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-ALLOW-CACHE:NO
#EXT-X-TARGETDURATION:3
#EXT-X-MEDIA-SEQUENCE:88
#EXTINF:2.976
19744.ts?wsSession=b76bc6a6ab0ddf454d935fd0-150329777870798&wsIPSercert=aa64bc2472e0b1bb9055e2aa4a1d744f&wsMonitor=-1&wsApp=HLS
#EXTINF:2.963
19745.ts?wsSession=b76bc6a6ab0ddf454d935fd0-150329777870798&wsIPSercert=aa64bc2472e0b1bb9055e2aa4a1d744f&wsMonitor=-1&wsApp=HLS
#EXTINF:2.971
19746.ts?wsSession=b76bc6a6ab0ddf454d935fd0-150329777870798&wsIPSercert=aa64bc2472e0b1bb9055e2aa4a1d744f&wsMonitor=-1&wsApp=HLS
#EXTINF:2.976這個標簽后面的一串亂七八槽就是ts媒體文件地址,可以是相對地址也可以是絕對地址,在這里顯然是相對地址。我們來拼接一下,看看這是什么東西,前邊是直播流域名,后邊接相對地址
live.hkstv.hk.lxdns.com/live/hks/19744.ts?wsSession=b76bc6a6ab0ddf454d935fd0-150329777870798&wsIPSercert=aa64bc2472e0b1bb9055e2aa4a1d744f&wsMonitor=-1&wsApp=HLS
用瀏覽器打開這個亂七八槽的網(wǎng)址,是不是驚奇的發(fā)現(xiàn)一個ts媒體文件就被下載下來了。
我們用VLC打開,其實就是一段幾秒的視頻,正是這一小段一小段幾秒種的視頻連續(xù)播放,就會變成我們看到的連續(xù)的直播或者點播。這個過程會一直持續(xù)知道出現(xiàn) 結(jié)束標記 #EXT-X-ENDLIST。如果結(jié)束標記不出現(xiàn),該索引就是用于持續(xù)廣播的??蛻舳藭ㄆ诘募虞d一些新的索引文件??蛻舳藭男赂碌乃饕募腥ゲ檎壹用苊荑€并且將關聯(lián)的URL加入到請求隊列中去。

各種標簽及其作用
#EXTM3U每個m3u8文件的開頭。
#EXT-X-PLAYLIST-TYPE:VOD指明流類型為點播VOD,直播為Live。
#EXTINF表示每個ts切片視頻文件的時長。
#EXT-X-TARGETDURATION指定當前視頻流中的切片文件的最大時長,,也就是說這些ts切片的時長不能大于#EXT-X-TARGETDURATION的值。
#EXT-X-STREAM-INF每一個#EXT-X-STREAM-INF的下一行是二級index文件的路徑,相對路徑或絕對路徑。
#EXT-X-ENDLIST這個表示視頻結(jié)束
HLS的缺點
采用HLS協(xié)議直播的視頻延遲時間無法下到10秒以下,而RTMP協(xié)議的延遲最低可以到3、4秒左右。所以說對直播延遲比較敏感的服務請慎用HLS
