流媒體協(xié)議--5:HLS

"本文轉(zhuǎn)載自:[^一二三^]的流媒體之HLS詳解"

1.簡(jiǎn)介

??HLS(HTTP Live streaming),是基于HTTP的流媒體傳輸協(xié)議,由apple公司所提出的一種由于傳輸音視頻的協(xié)議交互方式,當(dāng)前HLS被廣泛應(yīng)用于視頻點(diǎn)直播領(lǐng)域。HLS采用HTTP協(xié)議傳輸音視頻數(shù)據(jù),HLS通過(guò)將音視頻流切割成一個(gè)個(gè)小的TS切片及生成m3u8的播放列表文件,播放客戶端通過(guò)HTTP協(xié)議下載播放列表文件,按照播放列表文件制定的順序下載切片文件并播放,從而實(shí)現(xiàn)便下載邊播放,類似于實(shí)時(shí)在線播放的效果。

??由于傳輸層只采用HTTP協(xié)議,因此其具備HTTP的網(wǎng)傳優(yōu)勢(shì),比如可以方便的透過(guò)防火墻或者代理服務(wù)器,可簡(jiǎn)單的實(shí)現(xiàn)媒體流的負(fù)載均衡,可以方便的結(jié)合CDN進(jìn)行媒體分發(fā)等,另外HLS協(xié)議本身可實(shí)現(xiàn)碼率自適應(yīng),通過(guò)視頻轉(zhuǎn)碼,切片成不同碼率的TS文件,從而實(shí)現(xiàn)播放客戶端根據(jù)網(wǎng)絡(luò)帶寬情況,自由的選擇碼流進(jìn)行播放,但是HLS在直播時(shí)延時(shí)較大。

(1)HLS 協(xié)議編碼格式要求

  • 視頻的編碼格式:H264

  • 音頻的編碼格式:AAC、MP3、AC-3

  • 視頻的封裝格式:ts

  • 保存 ts 索引的 m3u8 文件

(2)HLS 協(xié)議優(yōu)勢(shì)

  • HLS相對(duì)于RTMP來(lái)講使用了標(biāo)準(zhǔn)的HTTP協(xié)議來(lái)傳輸數(shù)據(jù),可以避免在一些特殊的網(wǎng)絡(luò)環(huán)境下被屏蔽。

  • HLS相比RTMP在服務(wù)器端做負(fù)載均衡要簡(jiǎn)單得多。因?yàn)?HLS 是基于無(wú)狀態(tài)協(xié)議 HTTP 實(shí)現(xiàn)的,客戶端只需要按照順序使用下載存儲(chǔ)在服務(wù)器的普通 ts 文件進(jìn)行播放就可以。而 RTMP 是一種有狀態(tài)協(xié)議,很難對(duì)視頻服務(wù)器進(jìn)行平滑擴(kuò)展,因?yàn)樾枰獮槊恳粋€(gè)播放視頻流的客戶端維護(hù)狀態(tài)。

  • HLS 協(xié)議本身實(shí)現(xiàn)了碼率自適應(yīng),在不同帶寬情況下,設(shè)備可以自動(dòng)切換到最適合自己碼率的視頻播放。

(3)HLS 協(xié)議缺點(diǎn)

  • HLS 協(xié)議在直播的視頻延遲時(shí)間很難做到 10 s 以下延時(shí),而 RTMP 協(xié)議的延時(shí)可以降到 3s-4s 左右。

2.HLS架構(gòu)流程

??HLS整體流程框圖如下:

image.png

??音視頻輸入單元采集音視頻數(shù)據(jù),通過(guò)媒體編碼器編碼成所需要的編碼格式和碼率,并以TS格式對(duì)音視頻流進(jìn)行封裝,流切片器對(duì)封裝好的TS流,按照預(yù)設(shè)的分割時(shí)間大小對(duì)TS流進(jìn)行切片,并同時(shí)更新切片信息生成或更新m3u8文件列表文件,把播放列表文件和TS文件存儲(chǔ)到web服務(wù)器配置的路徑下,播放客戶端通過(guò)HTTP協(xié)議向web服務(wù)器拉取播放列表,根據(jù)播放列表內(nèi)容依次拉取TS切片文件并播放。

(1)媒體編碼器(media decoder)

??媒體編碼器獲取音視頻設(shè)備的實(shí)時(shí)信號(hào),通過(guò)預(yù)設(shè)的編碼格式進(jìn)行編碼,或者通過(guò)流媒體協(xié)議接入已編碼好的音視頻流,根據(jù)流媒體預(yù)設(shè)條件確定是否需要轉(zhuǎn)碼,由編碼或者轉(zhuǎn)碼操作,得到編碼后的音視頻流,然后根據(jù)TS封裝格式對(duì)音視頻流進(jìn)行封裝,封裝后發(fā)送到切片器進(jìn)行切片。

(2)流切片器(stream segmenter)

??接收媒體編碼器打包好的TS流,或者讀取TS流的錄像文件,按照預(yù)設(shè)時(shí)間間隔把TS流切片成等時(shí)間間隔的TS流切片文件,并生成或更新索引文件(m3u8文件/playlist播放列表文件),每個(gè)新的切片生成之后,索引文件都要更新,索引文件用于定位切片文件的位置及有效性判斷

(3)web服務(wù)器

??用來(lái)提供HTTP服務(wù)器,并提供索引文件和切片文件下載的服務(wù),這里可采用nginx來(lái)搭建。

??以上HLS流媒體架構(gòu)只是通用的框架,可根據(jù)HLS原理自行設(shè)計(jì)HLS流媒體架構(gòu)。

3.索引文件(m3u8文件)解析

??HLS 協(xié)議的主要內(nèi)容是關(guān)于 M3U8這個(gè)文本協(xié)議的,文本協(xié)議非常簡(jiǎn)潔,以下面的索引文件為例子進(jìn)行講解。

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.000000,
hls0.ts
#EXTINF:10.000000,
hls1.ts
#EXTINF:10.000000,
hls2.ts
  • EXTM3U:作為M3U文件的標(biāo)識(shí)符,文件類型標(biāo)識(shí),必須要有。

  • EXT-X-VERSION:協(xié)議的版本號(hào),而且每個(gè)M3U8中只能出現(xiàn)一次該標(biāo)簽,這里版本號(hào)為3。

  • EXT-X-TARGETDURATION:表示最長(zhǎng)分片的時(shí)長(zhǎng),這是必須的字段,秒為單位; 這里是10秒一個(gè)分片,也就是說(shuō)這些ts切片的時(shí)長(zhǎng)不能大于10的值。

  • EXT-X-MEDIA-SEQUENCE:表示索引文件中第一個(gè)分片的序列號(hào)(整數(shù)值),如果M3U8文件中沒有該字段,則playlist中第一個(gè)分片的序列號(hào)必須是0。

  • EXTINF:格式 EXTINF [duration],[title],duration 表示下一個(gè)分片的時(shí)長(zhǎng),對(duì)于每個(gè)分片,必須有該字段, 對(duì)于#EXT-X-VERSION小于3的情況下,duration必須是整數(shù);其他情況下duration可以是浮點(diǎn)數(shù)和整數(shù),這里每個(gè)分片的時(shí)常都是10;title:TS切片文件的URL地址,可以時(shí)相對(duì)地址例如2000kbps-0001.ts,其標(biāo)識(shí)地址與m3u8一致。

??這里是直播/實(shí)時(shí)視頻的文件格式,切片器對(duì)實(shí)時(shí)流進(jìn)行切片,生成新的切片后需要m3u8文件并老化前面的TS切片文件。

??如果是錄像的HLS播放,還會(huì)帶有#EXT-X-ENDLIST標(biāo)簽,如果有此標(biāo)簽,則表示錄像文件的播放,切片器會(huì)對(duì)整個(gè)文件進(jìn)行切片,并生成切片文件和m3u8,此時(shí)索引文件和切片文件在播放過(guò)程中不允許改變。

??此外可能還存在#EXT-X-PLAYLIST-TYPE標(biāo)簽,該標(biāo)簽可取值為EVENT/VOD,EVENT指的是分片工具只能在M3U8末尾添加新的分片的信息,但不能刪除老的分片,通常比較適用于直播+錄播的情況,VOD表示對(duì)錄像文件進(jìn)行的切片,如果M3U8中存在#EXT-X-ENDLIST標(biāo)簽時(shí),可以忽略EXT-X-PLAYLIST-TYPE。

??為了能夠?qū)崿F(xiàn)碼率自適應(yīng),HLS存在二級(jí)索引結(jié)構(gòu),一級(jí)索引文件存放的是不同碼率的HLS源的M3U8地址,也就是二級(jí)索引文件的地址,二級(jí)索引文件如上所示是真正記錄了同一碼率下TS切片序列的下載地址,一級(jí)索引文件格式如下:

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=1280000,AVERAGE-BANDWIDTH=1000000, RESOLUTION=704x576
http://example.com/d1.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=2, BANDWIDTH=2560000,AVERAGE-BANDWIDTH=2000000, RESOLUTION=1280x720
http://example.com/720p.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=3, BANDWIDTH=7680000,AVERAGE-BANDWIDTH=6000000, RESOLUTION=1920x1080
http://example.com/1080p.m3u8
  • EXTM3U:m3u文件標(biāo)識(shí)

  • EXT-X-STREAM-INF:格式[attribute=value][,attribute=value]* ,該標(biāo)簽的屬性列表中包含了可變碼率的描述信息;BANDWIDTH 指定碼率峰值,單位bits/s;AVERAGE-BANDWIDTH表示媒體流的的平均比特率,單位bits/s;CODECS包含媒體流中音視頻編碼格式相關(guān)的信息,RESOLUTION包含媒體流的中對(duì)應(yīng)視頻流的分辨率;FRAME-RATE視頻流的幀率;PROGRAM-ID 唯一ID,沒啥用處

二級(jí)索引文件播放特點(diǎn):

  • 主索引文件和子索引文件都是.M3U8的playlist。

  • 主索引文件只需下載一次,但對(duì)于直播節(jié)目子索引文件定期重新加載。

  • 客戶端可能會(huì)在任何時(shí)候改變到備用流,所有的切換都應(yīng)該使用相同的音頻文件

4.HLS會(huì)話流程

??HLS流媒體播放,通常包含直播Live 和 VOD(點(diǎn)播)兩種,點(diǎn)播VOD是當(dāng)前時(shí)間點(diǎn)可以獲取到所有index文件和ts文件,二級(jí)index文件中記錄了所有ts文件的地址,允許客戶端訪問全部?jī)?nèi)容,VOD點(diǎn)播擁有先進(jìn)的下載技術(shù),包括加密認(rèn)證技術(shù)和動(dòng)態(tài)切換文件傳輸速率的功能(通常用于不同分辨率視頻之間的切換)。

??Live模式會(huì)實(shí)時(shí)生成M3u8和ts文件,它的索引文件一直處于動(dòng)態(tài)變化的,播放的時(shí)候需要不斷下載二級(jí)index文件,以獲得最新生成的ts文件播放視頻,如果索引文件的末尾沒有#EXT-X-ENDLIST標(biāo)志,說(shuō)明它是一個(gè)Live視頻流;客戶端在播放VOD模式的視頻時(shí)其實(shí)只需要下載一次一級(jí)index文件和二級(jí)index文件就可以得到所有ts文件的下載地址,除非客戶端進(jìn)行比特率切換,否則無(wú)需再下載任何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)行播放。

5.HLS抓包分析

??以下是通過(guò)VLC播放HLS視頻的抓包文件,HLS地址:http://10.45.12.29/live/hls.m3u8

image.png
  • 首先第一步獲取播放列表索引文件:hls.m3u8,索引文件內(nèi)容如下:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:2
#EXTINF:10.000000,
hls2.ts
#EXTINF:10.000000,
hls3.ts
#EXTINF:10.000000,
hls4.ts

??根據(jù)索引文件可知,VLC客戶端一次拉取2,3,4個(gè)TS文件,TS切片文件地址為相對(duì)地址,VLC拉取相關(guān)切片時(shí),需要加上前綴,如:http://10.45.12.29/live/hls2.ts

??這里是一級(jí)播放索引,比較簡(jiǎn)單,HLS服務(wù)器切片時(shí),特別是實(shí)時(shí)流的情況下,切片涉及到更新m3u8、新生成TS切片和老化老的切片,需要注意老化時(shí)機(jī),如果搞錯(cuò)了可能會(huì)導(dǎo)致播放客戶端拉去了m3u8播放列表,在下載TS切片時(shí),下載不到的現(xiàn)象。以下是規(guī)范中有關(guān)索引文件有效期的說(shuō)明:

(1)如果播放列表索引文件沒有包含EXT-X-ENDLIST標(biāo)簽(hls的live流),那么服務(wù)器應(yīng)該使一個(gè)新版本的播放列表文件可用,并至少包含一個(gè)媒體文件的URL,新的播放列表索引文件必須與前一個(gè)播放列表索引文件在相對(duì)的時(shí)間內(nèi)有效:從上一個(gè)播放列表文索引件開始有效的時(shí)間算起,不早于0.5倍持續(xù)時(shí)間,不晚于1.5倍持續(xù)時(shí)間,也就是說(shuō)hls的live流要時(shí)刻更新m3u8文件,而更新時(shí)間要保持在[0.5,1.5]個(gè)ts持續(xù)時(shí)間內(nèi)。

(2)如果服務(wù)器期望移除TS切片,它必須使播放列表索引文件對(duì)于客戶端不可用,在播放列表被清除時(shí),它應(yīng)該確保播放列表文件中的所有媒體文件對(duì)于客戶端來(lái)說(shuō)至少在一個(gè)播放列表文件持續(xù)時(shí)間內(nèi)是可用的。

(3)服務(wù)器可以限制最近一段時(shí)間添加到播放列表文件中的媒體文件的可用性,為了達(dá)到這個(gè)目的,播放列表文件必須包含準(zhǔn)確的EXT-X-MEDIA-SEQUENCE標(biāo)簽。標(biāo)簽的值是按照從播放列表中移除的媒體文件的URL遞增的。

(4)媒體文件的URL必須按照其加入的順序移除。當(dāng)服務(wù)器從播放列表移除URL時(shí),媒體文件在一段時(shí)間內(nèi)必須保持可用,該時(shí)間等于媒體文件的時(shí)間加上包含該媒體文件的最長(zhǎng)播放列表文件的時(shí)間。

(5)當(dāng)媒體文件通過(guò)http傳輸給客戶端后,如果服務(wù)器打算移除該文件,那么它應(yīng)該確保http響應(yīng)頭包含反應(yīng)生存時(shí)間的過(guò)期頭。

(6)那些不包含EXT-X-ENDLIST標(biāo)簽的播放列表文件的持續(xù)時(shí)間必須至少三倍于targrt dutration。之所以為三倍的targrt dutration可能是因?yàn)?,根?jù)hls協(xié)議來(lái)看,每個(gè)終端的播放行為都是不一致的,對(duì)于點(diǎn)播的m3u8文件來(lái)說(shuō),都是從第一個(gè)文件開始播,但是對(duì)于直播的m3u8,播放器可以從任意一個(gè)文件開始向后(新的文件)追溯。不過(guò)一般的播放器都是從倒數(shù)第三個(gè)開始。

??也是就是說(shuō)hls的live流要時(shí)刻更新m3u8文件,而更新時(shí)間要保持在[0.5,1.5]個(gè)ts持續(xù)時(shí)間內(nèi),針對(duì)老化的TS文件,至少要保留3倍目標(biāo)持續(xù)時(shí)間之后再刪除,才能確??蛻舳双@取的播放列表文件,在下載TS切片時(shí),切片是可用的。

6.參考資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容