HTTP Live Streaming (HLS)
HTTP Live Streaming 簡稱為 HLS, 是一個(gè)基于 HTTP 的視頻流協(xié)議,由 APPLE 公司提出和實(shí)現(xiàn)。蘋果公司的很多產(chǎn)品都支持 HLS 協(xié)議,譬如 Mac OS 上的 QuickTime、Safari 以及 iOS 上的 Safari。蘋果 2009 年提出該協(xié)議,HLS 是 iOS 設(shè)備默認(rèn)要求的視頻流標(biāo)準(zhǔn)。安卓也支持HLS,見文章Guide to Mobile Video Streaming with HLS | Mux blog
Since then, Android has added support, as have most other platforms.
HLS 因?yàn)橐韵聨讉€(gè)原因比較受歡迎。
- HLS 幾乎可隨處播放。 幾個(gè)大平臺 web、mobile、tv 基本都有免費(fèi)的HLS 播放器支持。
- 蘋果 要求 HLS。 如果你想在 iOS 設(shè)備直播,逃不了的。
- HLS 相對簡單。 它使用了普遍且已經(jīng)存儲的視頻格式(MP4 或 TS,伴隨著 H.264 和 AAC 等編解碼器), 另外附加了一個(gè)丑陋但人類可讀的文本格式(m3u8).
- 它通過 HTTP 工作。 不需要跑特殊的服務(wù)(不像老舊校風(fēng)派的 RTMP 協(xié)議或者新潮的 WebRTC 協(xié)議). HLS 可以方便的透過防火墻或者代理服務(wù)器,而且可以很方便的利用 CDN 進(jìn)行分發(fā)加速,并且客戶端實(shí)現(xiàn)起來也很方便。
HLS 協(xié)議基于 HTTP,而一個(gè)提供 HLS 的服務(wù)器需要做兩件事:
- 編碼: 以 H.264 格式對圖像進(jìn)行編碼,以 MP3 或者 HE-AAC 對聲音進(jìn)行編碼,最終打包到 MPEG-2 TS(Transport Stream)容器之中;
- 分割: 把編碼好的 TS 文件等長切分成后綴為 ts 的小文件,并生成一個(gè) .m3u8 的純文本索引文件
HLS 把整個(gè)流分成一個(gè)個(gè)小的基于 HTTP 的文件來下載,每次只下載一些。HLS 協(xié)議由三部分組成:HTTP、M3U8、TS。這三部分中,HTTP 是傳輸協(xié)議,M3U8 是索引文件,TS 是音視頻的媒體信息。
瀏覽器使用的是 m3u8 文件。在 HTML5 頁面上使用 HLS 非常簡單,直接
或者
HLS的index文件就是m3u8的文件,先下載一級index file(master_playlist.m3u8),它里面記錄了二級索引文件的地址(Alternate-A、Alternate-B、Alternate-C)的地址,然后客戶端再去下載二級索引文件,二級索引文件中又記錄了TS文件的下載地址,這樣客戶端就可以按順序下載TS視頻文件并連續(xù)播放。
一個(gè)典型的一級索引 m3u8 文件格式如下:
#EXTM3U#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2000000,CODECS=”mp4a.40.2, avc1.4d401f”skiing-720p.m3u8#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=375000,CODECS=”mp4a.40.2, avc1.4d4015″skiing-360p.m3u8#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=750000,CODECS=”mp4a.40.2, avc1.4d401e”skiing-480p.m3u8#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=3500000,CODECS=”mp4a.40.2, avc1.4d401e”skiing-1080p.m3u8
[免費(fèi)分享]007,資料包括《Andoird音視頻開發(fā)必備手冊+音視頻學(xué)習(xí)視頻+學(xué)習(xí)文檔資料包+大廠面試真題+2022最新學(xué)習(xí)路線圖》等,點(diǎn)擊下方鏈接加衛(wèi)星獲取
FFmpegWebRTCRTMPRTSPHLSRTP播放器-音視頻流媒體高級開發(fā)
詳細(xì)介紹如下:
- bandwidth指定視頻流的比特率
- PROGRAM-ID無用無需關(guān)注,
- 每一個(gè)#EXT-X-STREAM-INF的下一行是二級index文件的路徑,可以用相對路徑也可以用絕對路徑。例子中用的是相對路徑。
一級索引 m3u8 文件中記錄了不同比特率視頻流的二級index文件路徑,客戶端可以自己判斷自己的現(xiàn)行網(wǎng)絡(luò)帶寬,來決定播放哪一個(gè)視頻流。也可以在網(wǎng)絡(luò)帶寬變化的時(shí)候平滑切換到和帶寬匹配的視頻流。
一個(gè)二級索引文件格式內(nèi)容如下 (skiing-480p.m3u8):
#EXTM3U#EXT-X-TARGETDURATION:10#EXT-X-VERSION:3#EXT-X-MEDIA-SEQUENCE:0#EXT-X-PLAYLIST-TYPE:VOD#EXTINF:9.97667,file000.ts#EXTINF:9.97667,file001.ts#EXTINF:9.97667,file002.ts#EXTINF:9.97667,file003.ts#EXTINF:9.97667,file004.ts
可以簡單的認(rèn)為二級 m3u8 就是包含多個(gè) ts 文件的播放列表。播放器按順序逐個(gè)播放,全部放完再請求一下 m3u8 文件,獲得包含最新 ts 文件的播放列表繼續(xù)播,周而復(fù)始。整個(gè)直播過程就是依靠一個(gè)不斷更新的 m3u8 和一堆小的 ts 文件組成,m3u8 必須動態(tài)更新,ts 可以走 CDN。
整體架構(gòu)
HLS的架構(gòu)分為三部分:Server,CDN,Client 。即服務(wù)器、分發(fā)組件和客戶端。架構(gòu)圖如下:
HLS 缺點(diǎn)
HLS 不是萬能的,它也有一個(gè)致命的弱點(diǎn):延遲現(xiàn)象非常明顯。如果每個(gè) ts 按照 5 秒來切分,一個(gè) m3u8 放 6 個(gè) ts 索引,那么至少就會帶來 30 秒的延遲。如果減少每個(gè) ts 的長度,減少 m3u8 中的索引數(shù),延時(shí)確實(shí)會減少,但會帶來更頻繁的緩沖,對服務(wù)端的請求壓力也會成倍增加。所以只能根據(jù)實(shí)際情況找到一個(gè)折中的點(diǎn)。
另外一點(diǎn), HLS 基于短連接 HTTP,HTTP 是基于 TCP 的,這就意味著 HLS 需要不斷地與服務(wù)器建立連接,TCP 每次建立連接時(shí)的三次握手、慢啟動過程、斷開連接時(shí)的四次揮手都會產(chǎn)生消耗。
Real Time Messaging Protocol (RTMP)
Real Time Messaging Protocol(簡稱 RTMP)是 Macromedia 開發(fā)的一套視頻直播協(xié)議,現(xiàn)在屬于 Adobe。
協(xié)議基于 TCP,是一個(gè)協(xié)議族,包括 RTMP 基本協(xié)議及 RTMPT/RTMPS/RTMPE 等多種變種。RTMP 是一種設(shè)計(jì)用來進(jìn)行實(shí)時(shí)數(shù)據(jù)通信的網(wǎng)絡(luò)協(xié)議,主要用來在 Flash/AIR 平臺和支持RTMP協(xié)議的流媒體/交互服務(wù)器之間進(jìn)行音視頻和數(shù)據(jù)通信。
無法支持移動端 WEB 播放是它的硬傷。雖然無法在iOS的H5頁面播放,但是iOS原生應(yīng)用可以寫解碼去解析的。瀏覽器端,HTML5 video標(biāo)簽無法播放 RTMP 協(xié)議的視頻,可以通過 video.js 來實(shí)現(xiàn)。
其主要優(yōu)點(diǎn):
- 實(shí)時(shí)性非常好,延時(shí)較小,通常為 1-3s
- 基于 TCP 長連接,不需要多次建連。
HLS 和 RTMP 對比
整體直播方案
如上所見,兩個(gè)協(xié)議各有所長,所以實(shí)際項(xiàng)目中需要自己抉擇到底采用哪種方案。直播整體架構(gòu)如下。
【學(xué)習(xí)更多-進(jìn)入鏈接點(diǎn)擊免費(fèi)報(bào)名,即可開始學(xué)習(xí)~】
【免費(fèi)】FFmpeg/WebRTC/RTMP/NDK/Android音視頻流媒體高級開發(fā)-學(xué)習(xí)視頻教程-騰訊課堂