項目中直播模塊開發(fā)小記验辞,自己負責其中的web端直播播放以及即時通信虏两。遂將直播相關(guān)的技術(shù)點以及開發(fā)過程中遇到的問題記錄下來,進行積累碟绑。
本文主要討論直播協(xié)議俺猿。直播業(yè)務(wù)主要分為三塊,采集端推流格仲、流媒體服務(wù)以及播放端押袍。在項目中,采集端凯肋,我們使用開源的OBS谊惭;流媒體服務(wù),公司是依托騰訊云的云直播服務(wù)侮东;播放端圈盔,web端使用的是同樣是騰訊云提供的播放器,客戶端應(yīng)該也是依托騰訊云提供的播放器SDK悄雅。
直播協(xié)議
直播協(xié)議即流媒體協(xié)議驱敲,主要由RTMP、RTSP宽闲、HLS众眨、HTTP-FLV。這邊我們將主要介紹常用的RTMP以及HLS容诬。
RTMP
RTMP(Real Time Messaging Protocol)娩梨,實時消息傳輸協(xié)議;是最初由Macromedia為通過互聯(lián)網(wǎng)在Flash播放器與一個服務(wù)器之間傳輸流媒體音頻览徒、視頻和數(shù)據(jù)而開發(fā)的一個專有協(xié)議狈定,后Macromedia被Adobe收購。
-
優(yōu)勢
-
延時小习蓬,實時性高
- 基于 TCP 長連接纽什,不需要多次建連措嵌;
- 從采集推流端到流媒體服務(wù)器再到播放端是一條數(shù)據(jù)流,因此在服務(wù)器不會有落地文件芦缰;RTMP的延時在3s之內(nèi)铅匹,對于實時性要求高的直播,RTMP協(xié)議是很好的選擇饺藤。
-
編碼兼容性高
-
基本上所有的編碼器(攝像頭之類)都支持RTMP輸出;windows系統(tǒng)的PC端的瀏覽器節(jié)本上都支持flash流礁。
- 支持加密
RTMPE和RTMPS為加密協(xié)議 -
劣勢
-
播放端兼容性差
- 蘋果系的播放端都是無法直接播放的涕俗,需要依賴第三放解碼器,由此會帶來發(fā)熱神帅、耗電等問題再姑。
- 移動端瀏覽器很少支持flash,所以flv格式文件的播放收到了很大的限制找御。針對這個問題元镀,B站在2016年開源了flv.js,一個實現(xiàn)了在HTML5 視頻中播放FLV格式視頻的Javascript庫霎桅;其實現(xiàn)原理是將flv文件流轉(zhuǎn)碼復(fù)用成ISO BMFF(MP4 碎片)片段栖疑,然后通過Media Source Extensions將MP4片段喂進瀏覽器。MSE頁有同樣存在一定的瀏覽器兼容性問題滔驶,但是支持度還是可以遇革。相信之后瀏覽器的迭代,對于MSE的支持會越來越好揭糕。
caniuse網(wǎng)站給出的MSE兼容統(tǒng)計
-
HLS
HLS(HTTP Live Streaming)萝快,是蘋果公司實現(xiàn)的基于 HTTP 的流媒體傳輸協(xié)議,可支持流媒體的直播和點播著角,主要應(yīng)用在 iOS 系統(tǒng)揪漩,為 iOS 設(shè)備(如 iPhone、iPad)提供音視頻直播和點播方案吏口。
-
優(yōu)勢
-
性能高
-
穿墻
-
互聯(lián)網(wǎng)不可能不開放HTTP協(xié)議,否則就不叫互聯(lián)網(wǎng)囚痴。所以任何端口封掉叁怪,也不會導致HTTP流看不了。(不過RTMP也能穿墻深滚,用RTMPT協(xié)議)奕谭。
+ ##### 兼容性
+ 蘋果開發(fā)的協(xié)議涣觉,所以在PC或者移動端的safari瀏覽器中,肯定是絕對支持血柳;
+ 其他瀏覽器中支持也并不好官册。從下圖中可以看出,時長占額較大的兩大瀏覽器廠商Chrome和FireFox對蘋果出的協(xié)議并不買賬难捌。所以強大的MSE又出場了膝宁,現(xiàn)在有開源的hls.js對m3u8格式的視頻進行轉(zhuǎn)碼在pc端播放。
-
劣勢
-
延時較大
HLS 的基本原理就是當采集推流端將視頻流推送到流媒體服務(wù)器時,服務(wù)器將收到的流信息每緩存一段時間就封包成一個新的 ts 文件击敌,同時服務(wù)器會建立一個 m3u8 的索引文件來維護最新幾個 ts 片段的索引介返。當播放端獲取直播時,它是從 m3u8 索引文件獲取最新的 ts 視頻文件片段來播放沃斤,從而保證用戶在任何時候連接進來時都會看到較新的內(nèi)容圣蝎,實現(xiàn)近似直播的體驗。相對于常見的流媒體直播協(xié)議衡瓶,例如 RTMP 協(xié)議徘公、RTSP 協(xié)議等,HLS 最大的不同在于直播客戶端獲取到的并不是一個完整的數(shù)據(jù)流鞍陨,而是連續(xù)的步淹、短時長的媒體文件,客戶端不斷的下載并播放這些小文件诚撵。這種方式的理論最小延時為一個 ts 文件的時長缭裆,一般情況為 2-3 個 ts 文件的時長。HLS 的分段策略寿烟,基本上推薦是 10 秒一個分片澈驼。 -
直播協(xié)議對比
總結(jié)
綜上看出,rtmp和hls這兩種主流的直播協(xié)議徘六,當前是各有利弊内边;所以想要在各種場景下實現(xiàn)比較好的直播效果,就需要具體問題具體分析待锈。
比如在PC漠其,我們可以可以使用rtmp協(xié)議,由于當前瀏覽器對flash仍然后較好支持,PC端就可以充分發(fā)揮rtmp延時小和屎,實時性高的優(yōu)勢拴驮;
而在移動端,hls協(xié)議的兼容性要更勝一籌柴信,我們便可以使用該協(xié)議套啤;
同時,我們還可以使用基于MSE對各種視頻文件進行處理随常,得到兼容性更好的視頻格式潜沦;
當然,使用第三方較為健壯的播放器也是個不錯的選擇绪氛;對于直播播放的討論止潮,會在該系列另一篇文章中進行討論。
參考
1钞楼、直播協(xié)議的選擇:RTMP vs. HLS
2、關(guān)于直播視頻格式和瀏覽器兼容性歷史的來龍去脈
3袄琳、理解RTMP询件、HttpFlv和HLS的正確姿勢
4、RTMP HLS HTTP 直播協(xié)議一次看個夠