流媒體伺服器如何讓WebRTC支援H.265,同時又能支援Web Chrome硬解碼、軟解碼:DataChannel+MSE+WASM解碼H.265

Babosa|EasyDarwin發表於2024-08-20

為了這一整套的解決方案,調研+研發整整花費了差不多半年多的時間,需達成的目標:

  1. 流媒體伺服器端不需要將H.265轉碼成H.264,就能讓Chrome解碼播放H.265;

注意:現在很多市面上的軟硬體透過轉碼H.265成H.264的方式來支援WebRTC,個人理解,這既費硬體又是技術的倒退!

  1. Web JS解碼H.265在之前就WASM(WebAssembly)一種方式,但是後來Chrome支援了H.265的硬解碼,於是,Web解碼H.265就有了MSE和WebCodecs多種方式;
  2. 既然是解碼播放,那肯定有支援硬體的,也有不支援硬解碼H.265的,那WebAssembly軟解碼H.265就成為了託底的選項;
  3. WASM解碼H.265也有多種模式,單執行緒的WASM解碼模式,還有多執行緒WASM SIMD模式,效率上差距也是不小的;

解決方案

  1. 我們採用了H.265+AAC(音訊透過轉碼統一成了AAC編碼格式)封裝成FLV格式,然後再透過WebRTC的DataChannel方式,傳輸到客戶端;

WebRTC有VideoChannel、AudioChannel和DataChannel,原來DataChannel只是為了傳輸一些私有資訊,現在也用來傳輸影片資料了,效果挺好!

  1. DataChannel傳輸到客戶端之後,回撥到上層進行類似於HTTP-FLV或者WebSocket-FLV的模式,選擇MSE硬體、WebCodecs硬解,或者選擇WASM軟解碼的方式,進行解碼;
  2. WebRTC的DataChannel可以透過UDP或者TCP進行傳輸,完全利用了WebRTC的高效QoS策略,使用者只需要做好服務端的FLV封裝和客戶端的FLV解碼播放就可以了!!!

效果如圖:

相關文章