HLS協(xié)議介紹

今天來介紹一下HLS協(xié)議,這個(gè)協(xié)議是由蘋果公司提出并推廣開來的。來一段維基百科的定義育韩。

HTTP Live Streaming(縮寫是HLS)是一個(gè)由蘋果公司提出的基于HTTP流媒體網(wǎng)絡(luò)傳輸協(xié)議畦攘。是蘋果公司QuickTime XiPhone軟件系統(tǒng)的一部分。它的工作原理是把整個(gè)流分成一個(gè)個(gè)小的基于HTTP的文件來下載错妖,每次只下載一些。當(dāng)媒體流正在播放時(shí)疚沐,客戶端可以選擇從許多不同的備用源中以不同的速率下載同樣的資源暂氯,允許流媒體會(huì)話適應(yīng)不同的數(shù)據(jù)速率。在開始一個(gè)流媒體會(huì)話時(shí)亮蛔,客戶端會(huì)下載一個(gè)包含元數(shù)據(jù)的extended M3U (m3u8)playlist文件痴施,用于尋找可用的媒體流。
HLS只請(qǐng)求基本的HTTP報(bào)文,與實(shí)時(shí)傳輸協(xié)議(RTP)不同辣吃,HLS可以穿過任何允許HTTP數(shù)據(jù)通過的防火墻或者代理服務(wù)器动遭。它也很容易使用內(nèi)容分發(fā)網(wǎng)絡(luò)來傳輸媒體流。
蘋果公司把HLS協(xié)議作為一個(gè)互聯(lián)網(wǎng)草案(逐步提交)神得,在第一階段中已作為一個(gè)非正式的標(biāo)準(zhǔn)提交到IETF厘惦。但是,即使蘋果偶爾地提交一些小的更新哩簿,IETF卻沒有關(guān)于制定此標(biāo)準(zhǔn)的有關(guān)進(jìn)一步的動(dòng)作宵蕉。[1]

協(xié)議簡介

HLS協(xié)議規(guī)定:

  • 視頻的封裝格式是TS。
  • 視頻的編碼格式為H264,音頻編碼格式為MP3节榜、AAC或者AC-3羡玛。
  • 除了TS視頻文件本身,還定義了用來控制播放的m3u8文件(文本文件)宗苍。

為什么蘋果要提出HLS這個(gè)協(xié)議稼稿,其實(shí)他的主要是為了解決RTMP協(xié)議存在的一些問題。比如RTMP協(xié)議不使用標(biāo)準(zhǔn)的HTTP接口傳輸數(shù)據(jù)浓若,所以在一些特殊的網(wǎng)絡(luò)環(huán)境下可能被防火墻屏蔽掉渺杉。但是HLS由于使用的HTTP協(xié)議傳輸數(shù)據(jù),不會(huì)遇到被防火墻屏蔽的情況(該不會(huì)有防火墻連80接口都不放過吧)挪钓。

另外于負(fù)載是越,RTMP是一種有狀態(tài)協(xié)議,很難對(duì)視頻服務(wù)器進(jìn)行平滑擴(kuò)展碌上,因?yàn)樾枰獮槊恳粋€(gè)播放視頻流的客戶端維護(hù)狀態(tài)倚评。而HLS基于無狀態(tài)協(xié)議(HTTP),客戶端只是按照順序使用下載存儲(chǔ)在服務(wù)器的普通TS文件馏予,做負(fù)責(zé)均衡如同普通的HTTP文件服務(wù)器的負(fù)載均衡一樣簡單天梧。

另外HLS協(xié)議本身實(shí)現(xiàn)了碼率自適應(yīng),不同帶寬的設(shè)備可以自動(dòng)切換到最適合自己碼率的視頻播放霞丧。其實(shí)HLS最大的優(yōu)勢就是他的親爹是蘋果呢岗。蘋果在自家的IOS設(shè)備上只提供對(duì)HLS的原生支持,并且放棄了flash蛹尝。Android也迫于平果的“淫威”原生支持了HLS后豫。這樣一來flv,rtmp這些Adobe的視頻方案要想在移動(dòng)設(shè)備上播放需要額外下點(diǎn)功夫突那。當(dāng)然flash對(duì)移動(dòng)設(shè)備造成很大的性能壓力確實(shí)也是自身的問題挫酿。

但HLS也有一些無法跨越的坑,比如采用HLS協(xié)議直播的視頻延遲時(shí)間無法下到10秒以下愕难,而RTMP協(xié)議的延遲最低可以到3早龟、4秒左右惫霸。所以說對(duì)直播延遲比較敏感的服務(wù)請(qǐng)慎用HLS

圖片來源于蘋果官網(wǎng)

來解釋一下這張圖葱弟,從左到右講壹店,左下方的inputs的視頻源是什么格式都無所謂,他與server之間的通信協(xié)議也可以任意(比如RTMP)芝加,總之只要把視頻數(shù)據(jù)傳輸?shù)椒?wù)器上即可茫打。這個(gè)視頻在server服務(wù)器上被轉(zhuǎn)換成HLS格式的視頻(既TS和m3u8文件)文件。細(xì)拆分來看server里面的Media encoder的是一個(gè)轉(zhuǎn)碼模塊負(fù)責(zé)將視頻源中的視頻數(shù)據(jù)轉(zhuǎn)碼到目標(biāo)編碼格式(H264)的視頻數(shù)據(jù)妖混,視頻源的編碼格式可以是任何的視頻編碼格式(參考《視頻技術(shù)基礎(chǔ)》)。轉(zhuǎn)碼成H264視頻數(shù)據(jù)之后轮洋,在stream segmenter模塊將視頻切片制市,切片的結(jié)果就是index file(m3u8)和ts文件了。圖中的Distribution其實(shí)只是一個(gè)普通的HTTP文件服務(wù)器弊予,然后客戶端只需要訪問一級(jí)index文件的路徑就會(huì)自動(dòng)播放HLS視頻流了祥楣。

HLS的index文件

所謂index文件就是之前說的m3u8文本文件。

圖片來源于蘋果官網(wǎng)

如上圖所示汉柒,客戶端播放HLS視頻流的邏輯其實(shí)非常簡單误褪,先下載一級(jí)Index file,它里面記錄了二級(jí)索引文件(Alternate-A碾褂、Alternate-B兽间、Alternate-C)的地址,然后客戶端再去下載二級(jí)索引文件正塌,二級(jí)索引文件中又記錄了TS文件的下載地址嘀略,這樣客戶端就可以按順序下載TS視頻文件并連續(xù)播放。

一級(jí)index文件

視頻源:https://dco4urblvsasc.cloudfront.net/811/81095_ywfZjAuP/game/index.m3u8

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1064000
1000kbps.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=564000
500kbps.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=282000
250kbps.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2128000
2000kbps.m3u8

bandwidth指定視頻流的比特率乓诽,PROGRAM-ID無用無需關(guān)注帜羊,每一個(gè)#EXT-X-STREAM-INF的下一行是二級(jí)index文件的路徑,可以用相對(duì)路徑也可以用絕對(duì)路徑鸠天。例子中用的是相對(duì)路徑讼育。這個(gè)文件中記錄了不同比特率視頻流的二級(jí)index文件路徑,客戶端可以自己判斷自己的現(xiàn)行網(wǎng)絡(luò)帶寬稠集,來決定播放哪一個(gè)視頻流奶段。也可以在網(wǎng)絡(luò)帶寬變化的時(shí)候平滑切換到和帶寬匹配的視頻流。

#EXTM3U
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-TARGETDURATION:10
#EXTINF:10,
2000kbps-00001.ts
#EXTINF:10,
2000kbps-00002.ts
#EXTINF:10,
2000kbps-00003.ts
#EXTINF:10,
2000kbps-00004.ts
#EXTINF:10,

... ...

#EXTINF:10,
2000kbps-00096.ts
#EXTINF:10,
2000kbps-00097.ts
#EXTINF:10,
2000kbps-00098.ts
#EXTINF:10,
2000kbps-00099.ts
#EXTINF:10,
2000kbps-00100.ts
#ZEN-TOTAL-DURATION:999.66667
#ZEN-AVERAGE-BANDWIDTH:2190954
#ZEN-MAXIMUM-BANDWIDTH:3536205
#EXT-X-ENDLIST

二級(jí)文件實(shí)際負(fù)責(zé)給出ts文件的下載地址巍杈,這里同樣使用了相對(duì)路徑忧饭。#EXTINF表示每個(gè)ts切片視頻文件的時(shí)長。#EXT-X-TARGETDURATION指定當(dāng)前視頻流中的切片文件的最大時(shí)長筷畦,也就是說這些ts切片的時(shí)長不能大于#EXT-X-TARGETDURATION的值词裤。#EXT-X-PLAYLIST-TYPE:VOD的意思是當(dāng)前的視頻流并不是一個(gè)直播流刺洒,而是點(diǎn)播流,換句話說就是該視頻的全部的ts文件已經(jīng)被生成好了吼砂,#EXT-X-ENDLIST這個(gè)表示視頻結(jié)束逆航,有這個(gè)標(biāo)志同時(shí)也說明當(dāng)前的流是一個(gè)非直播流。

播放模式

  • 點(diǎn)播VOD的特點(diǎn)就是當(dāng)前時(shí)間點(diǎn)可以獲取到所有index文件和ts文件渔肩,二級(jí)index文件中記錄了所有ts文件的地址因俐。這種模式允許客戶端訪問全部內(nèi)容。上面的例子中就是一個(gè)點(diǎn)播模式下的m3u8的結(jié)構(gòu)周偎。

  • Live 模式就是實(shí)時(shí)生成M3u8和ts文件抹剩。它的索引文件一直處于動(dòng)態(tài)變化的,播放的時(shí)候需要不斷下載二級(jí)index文件蓉坎,以獲得最新生成的ts文件播放視頻澳眷。如果一個(gè)二級(jí)index文件的末尾沒有#EXT-X-ENDLIST標(biāo)志,說明它是一個(gè)Live視頻流蛉艾。

客戶端在播放VOD模式的視頻時(shí)其實(shí)只需要下載一次一級(jí)index文件和二級(jí)index文件就可以得到所有ts文件的下載地址钳踊,除非客戶端進(jìn)行比特率切換,否則無需再下載任何index文件勿侯,只需順序下載ts文件并播放就可以了拓瞪。但是Live模式下略有不同,因?yàn)椴シ诺耐瑫r(shí)助琐,新ts文件也在被生成中祭埂,所以客戶端實(shí)際上是下載一次二級(jí)index文件,然后下載ts文件弓柱,再下載二級(jí)index文件(這個(gè)時(shí)候這個(gè)二級(jí)index文件已經(jīng)被重寫沟堡,記錄了新生成的ts文件的下載地址),再下載新ts文件,如此反復(fù)進(jìn)行播放矢空。

總結(jié)

其他的一些細(xì)節(jié)不想寫了航罗,發(fā)現(xiàn)簡書上有一個(gè)作者寫的很好了,其實(shí)我上面的總結(jié)和他的文章相比也沒有什么新的內(nèi)容屁药。建議去看他的文章《HTTP Live Streaming (HLS) - 概念》粥血。

參考:
蘋果官方文檔
HLS-iOS視頻播放服務(wù)架構(gòu)深入探究
HLS標(biāo)準(zhǔn)協(xié)議

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市酿箭,隨后出現(xiàn)的幾起案子复亏,更是在濱河造成了極大的恐慌,老刑警劉巖缭嫡,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缔御,死亡現(xiàn)場離奇詭異,居然都是意外死亡妇蛀,警方通過查閱死者的電腦和手機(jī)耕突,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門笤成,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人眷茁,你說我怎么就攤上這事炕泳。” “怎么了上祈?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵培遵,是天一觀的道長。 經(jīng)常有香客問我登刺,道長籽腕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任纸俭,我火速辦了婚禮节仿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘掉蔬。我一直安慰自己,他們只是感情好矾瘾,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布女轿。 她就那樣靜靜地躺著,像睡著了一般壕翩。 火紅的嫁衣襯著肌膚如雪蛉迹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天放妈,我揣著相機(jī)與錄音北救,去河邊找鬼。 笑死芜抒,一個(gè)胖子當(dāng)著我的面吹牛珍策,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宅倒,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼攘宙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拐迁?” 一聲冷哼從身側(cè)響起蹭劈,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎线召,沒想到半個(gè)月后铺韧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缓淹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年哈打,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了塔逃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡前酿,死狀恐怖患雏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情罢维,我是刑警寧澤淹仑,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站肺孵,受9級(jí)特大地震影響匀借,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜平窘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一吓肋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瑰艘,春花似錦是鬼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至芒率,卻和暖如春囤耳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背偶芍。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工充择, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人匪蟀。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓椎麦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親材彪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子铃剔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容