HLS直播協議在B站的實踐
01 背景
在音影片直播領域,各種新技術與新標準層出不窮,直播場景也愈發複雜。為了更好的面對未來的挑戰,我們需要亟需下一代直播協議來支援這些新標準的落地,B站在此方面進行了探索,率先在國內推行HLS(fmp4)協議在國內直播領域大規模落地。本期我們主要分享HLS在B站落地方面的工程實踐經驗。
02 現狀與問題
傳統直播技術使用的傳輸協議主要是RTMP/HTTP-FLV。其中RTMP是有Adobe公司開發的,雖然不是國際標準,但在當年Flash流行的年代影響下,成為了業界事實標準。
基於RTMP/FLV協議的直播,是國內比較成熟的直播架構體系,在行業中已經投入使用近10年。一個典型的直播架構圖如下:
基於RTMP/FLV協議從技術上也比較成熟,整個生態支援度非常完善。但從長遠考慮,RTMP也存在各種無法解決的問題,這讓我們對未來相容性有很大的擔憂。
首先,RTMP/FLV標準已經超過10年沒有更新,在相容性層面已經面臨著很大挑戰,比如對h265的支援,當前業界是透過hack的方式進行追加,但如ffmpeg都需要打補丁之後才能支援,各種系統工具支援性較差。甚至也會出現各家hack的方式不同,導致系統無法對接。如果涉及到出海的業務,由於無法對齊國際標準,難以與海外公司展開技術合作。
其次,主流的瀏覽器原生不支援FLV,需要在web端進行一次額外的轉封裝操作,會有額外開銷,在使用者裝置負載較高時,可能會影響觀看體驗。
最後,在直播場景中,非常適合p2p的應用,可以極大降低頻寬成本,但在流式協議上構建P2P成本較高,通常也會犧牲標準的相容性。
在對現有主流的直播協議做了充分調研後,HLS(fmp4)協議進入了我們的視野。相比較上述RTMP協議的一些缺點,HLS(fmp4)出現完美解決上述這些問題。
fmp4標準一直處於MPEG標準的維護中,對各種編碼器和新技術, 如AV1,VVC支援度非常完善。主流瀏覽器也支援fmp4格式,省去了中間轉封裝的開銷,可以減少網頁端處理壓力。
其次,CDN部署更容易,因為HLS是基於檔案傳輸,傳統的靜態檔案CDN只需要少量配置更改就可以支援相關業務,對傳輸內容不敏感。
另外,fmp4在DRM支援性上非常好,可以對版權內容做更好的保護。
最後,利用切片檔案實現P2P較為方便,檔案P2P方案在業界成熟, 也可以做到比較好的分享率,在直播場景中P2P可以有效節省頻寬成本。
綜合以上各方面,我們確定了要將HLS(fmp4)協議作為支撐未來新技術落地的主要方向。
03 HLS直播協議簡介
HLS全稱為 HTTP Live Streaming,是由蘋果公司提出基於HTTP的流媒體網路傳輸協議。其基本原理是將直播的流式資料透過切割成一個個小檔案,將這些小檔名記錄成到一個索引檔案中,播放器先請求索引檔案,然後再取到對應的切片的檔案,透過請求一個個小檔案實現連續的播放。
流程如下圖:
一個典型的索引檔案(也稱為M3U8播放列表)如下:
隨著直播流的進行,播放列表中的切片檔案會進行不停更新,播放器不停的請求索引檔案和切片檔案下載到媒體資料,進行解碼播放,這樣就實現了畫面直播。
HLS協議主要有兩種版本,mpegts版本和fmp4,顧名思義,他們主要的區別在於封裝容器的不同,前者基於mpegts封裝,mpegts因為有出色的糾錯能力,常用於廣播電視衛星傳輸。而後者在2017年8月正式進入ISO RFC8216標準,fMP4(分段式MP4)的封裝格式正式被HLS支援。
fMP4不是一種新的封裝格式,而是在傳統MP4格式基礎上增加若干新特性。傳統的MP4因為檔案結構所限,所有的索引和資料都是放在一起的,在播放時兩者缺一不可,無法實現流式直播。fMP4主要是將MP4檔案切割成更細的粒度,播放器可以載入一小部分資料之後就可以進行播放,這樣就可以實現直播。
下圖展示了MP4與fMP4的內部結構的區別:
04 直播架構設計
4.1 生產架構設計
在直播生產架構設計上,首先要保證穩定性和可靠性。我們重點做了以下幾點:
在生產端使用了叢集化進行切片的生產, 切片會在記憶體和檔案物件儲存進行雙寫
熱備能力, 隨時可以調整內部回源鏈路, 防止鏈路故障
從記憶體到持久化物件儲存, 分級回源策略
可分散式部署, 利用HTTP302進行分散式排程
由於HLS協議問題,對磁碟IO要求非常高,我們使用Linux系統提供的記憶體對映盤去寫檔案,無論是寫檔案還是檔案回源的讀取速度都非常理想。但由於記憶體只能存有很少的切片,所以能儲存的切片比較少,只用作實時直播回源,同時切片也會非同步寫入檔案物件儲存,用來做直播回放,在回源鏈路發生故障時,會自動進行降級,利用檔案物件儲存暫時對外提供回源服務。
4.2 回源架構設計
在回源架構方面,我們設計了一套動態回源方案。CDN在回源時需要根據我們的回源服務進行回源地址的查詢,相比較固定的回源配置,我們可以實時上下線某些節點,也可以減少回源鏈路上面的延遲,在排程上比較靈活,同時容災能力也極大提升。
除了提供動態回源查詢服務之外,我們也充分利用了http302特性,允許使用http302進行回源跳轉,在故障發生時可以做到自適應降級。
05 HLS啟播最佳化
在HLS標準當中,每一個單獨的切片檔案都是一個GOP,但直播場景中使用者推流的GOP大小都不固定,如果完全按照標準去實現的話就可能會導致切片長度過大,客戶端下載時間過長,從而導致啟播時間比較久。
在我們的實踐中,首先採用了1s長度的切片,可以儘可能縮短因為產生切片所造成延遲,這樣會出現一個問題,就是每一個切片可能不是一個GOP, 如果按照預設的客戶端拉播放列表中最後三個切片進行播放,一旦倒數第三個的第一幀不是關鍵幀就會導致啟播很慢或無法啟播。在HLS標準中#EXT-X-START:TIME-OFFSET=0標籤會告知客戶端,從列表的第一個切片開始播放。
此時我們只需要保證列表的第一個切片的第一幀為關鍵幀,客戶端就可以快速載入到關鍵幀。
此外,利用了fmp4和CMAF(一種基於mp4上的封裝技術,與fmp4非常類似)的封裝特性,在一個切片檔案中可以進行了更小粒度的封裝(chunk),使得客戶端在下載幾幀資料後就可以開始進行解碼播放。如上圖,對於第一個切片檔案,客戶端只需要下載第一個chunk拿到第一幀,就可以完成啟播。這樣就完成了不在破壞標準相容性的基礎上實現了啟播的最佳化。
由於採用了1s一個切片的方式,相比較RTMP/FLV來講,整體延遲只增加了1s,是一個可以接受的範圍。相比較傳統的HLS來講,首幀提速2-3倍,配合客戶端的追幀策略也可以使延遲得到很好的控制。
06 直播回放實現
由於HLS協議,是將流媒體進行切片,我們只需要將切片的儲存時間延長,就可以讓使用者訪問到之前的內容。具體的實現方法是,在直播生成索引檔案的過程中,只需要同時生成對應的時間戳的索引檔案,例如直播時索引檔案叫index.m3u8,此時同時生成一份utc.m3u8,在使用者選擇回放時服務端會返回對應時間點的索引檔案。這樣就完成了直播回放的功能。除了需要檔案儲存更長的時間外,其他無需改動,實現比較容易。
除了用作直播回放之外,更可以用做錄影進行長久儲存,對稽核相關業務也可以很好的支援,同時省卻了專門維護錄影業務的麻煩。
07 回源預熱最佳化
HLS與RTMP/HTTP-FLV在回源上最大的不同在於,HLS是短連結, RTMP/HTTP-FLV是長連結。兩種各有優缺,長連結只建立一次連結,開銷較低,但在抗網路抖動性比較差, 遇到抖動時間短,且抖動強的狀況,連結可能就直接斷開,就會造成使用者觀看黑屏,但對於短連結,由於可以快速重試,時間短而劇烈抖動,可以比較快速進行恢復,某些情況下甚至使用者端可能不會有感知到卡頓,但短連結需要頻繁請求響應,對伺服器CPU消耗較高。
HLS在回源鏈路上,全鏈路都支援了HTTP1.1,保證底層共享長連結,避免頻繁TCP建聯的開銷。另一方面,我們利用了CMAF和HTTP Chunk傳輸特性,在服務端允許檔案的邊寫邊發,在切片還未完全落盤之前就可以允許CDN提前回源,存幾幀資料就發幾幀,直到指定切割點後,資料傳送完成之後,斷開請求,CDN已經儲存了這份檔案的快取,這時切片服務再去更新M3U8播放列表。當客戶端播到最新一個分片時,CDN由於提前進行過回源,已經快取了對應檔案。這種資源預熱策略,尤其是針對頻繁請求小分片的檔案,可以有效提升回源質量。
08 展望總結
得益於底層fmp4提供的豐富的擴充套件性,我們正在技術和業務上做更多的嘗試,如直播DRM的應用,自適應清晰度,數字水印,杜比世界/全景聲直播等,後續也會有相關文章介紹,請持續關注我們。
出於對新技術和新業務的探索,B站前幾年在業內率先引入SRT協議,如今我們在業內大規模落地HLS(fmp4),從直播上行到下行完成了技術探索,為我們後續技術演進做了深厚的積累,也標誌我們可以嘗試慢慢擺脫老舊的RTMP協議限制,真正的擁抱下一代直播技術!
來自 “ 嗶哩嗶哩技術 ”, 原文作者:多媒體&B端技術;原文連結:http://server.it168.com/a2022/0824/6759/000006759588.shtml,如有侵權,請聯絡管理員刪除。
相關文章
- HDFS EC在B站的實踐
- 直播協議詳解 RTMP、HLS、HTTP-FLV、WebRTC、RTSP協議HTTPWeb
- 大型網站的 HTTPS 實踐(四):協議層以外的實踐網站HTTP協議
- 大型網站的 HTTPS 實踐(四)——協議層以外的實踐網站HTTP協議
- MQTT協議實踐MQQT協議
- RTMP、HTTP-FLV、HLS,你瞭解常見的三大直播協議嗎HTTP協議
- Flink 在 B 站的多元化探索與實踐
- hls協議視訊(.m3u8)在瀏覽器播放協議瀏覽器
- Apache Hudi 在 B 站構建實時資料湖的實踐Apache
- 大型網站的HTTPS實踐(一)——HTTPS協議和原理網站HTTP協議
- 大型網站的 HTTPS 實踐(一): HTTPS 協議和原理網站HTTP協議
- 大型網站的 HTTPS 實踐(一)—— HTTPS 協議和原理網站HTTP協議
- DWDM技術在B站基礎工程的落地實踐之路
- SRS系列二——初步實現HLS直播
- QUIC 協議初探 - iOS 實踐UI協議iOS
- FFmpeg實現監控攝像頭的RTSP協議轉RTMP協議直播協議
- RPC協議實踐入門RPC協議
- 實現網站由http協議轉為https協議網站HTTP協議
- 大型網站的 HTTPS 實踐(3):基於協議和配置的優化網站HTTP協議優化
- 大型網站的 HTTPS 實踐(三):基於協議和配置的優化網站HTTP協議優化
- 大型網站的 HTTPS 實踐(三)——基於協議和配置的優化網站HTTP協議優化
- 協程在RN中的實踐
- B站故障演練平臺實踐
- WebSocket原理與實踐(二)---WebSocket協議Web協議
- 時間同步協議NTP - 原理&實踐協議
- B站雲原生混部技術實踐
- B 站構建實時資料湖的探索和實踐
- B站資深運維工程師:DCDN在遊戲應用加速中的實踐運維工程師遊戲
- B站公網架構實踐及演進架構
- 節省數億IT成本,B站FinOps實踐
- 從Html5直播到互動直播,看直播協議的選擇HTML協議
- HLS與RTMP在直播場景下的優劣分析以及架構分析架構
- 搭建個人直播間,實現24小時B站、鬥魚、虎牙等無人直播!
- MQTT協議詳解及v5.0實踐MQQT協議
- HLS直播技術方案及踩過的坑
- 在B站學Java!Java
- 淺析 HLS 流媒體協議協議
- Golang開源流媒體伺服器(RTMP/RTSP/HLS/FLV等協議)Golang伺服器協議