為了這一整套的解決方案,調研+研發整整花費了差不多半年多的時間,需達成的目標:
- 流媒體伺服器端不需要將H.265轉碼成H.264,就能讓Chrome解碼播放H.265;
注意:現在很多市面上的軟硬體透過轉碼H.265成H.264的方式來支援WebRTC,個人理解,這既費硬體又是技術的倒退!
- Web JS解碼H.265在之前就WASM(WebAssembly)一種方式,但是後來Chrome支援了H.265的硬解碼,於是,Web解碼H.265就有了MSE和WebCodecs多種方式;
- 既然是解碼播放,那肯定有支援硬體的,也有不支援硬解碼H.265的,那WebAssembly軟解碼H.265就成為了託底的選項;
- WASM解碼H.265也有多種模式,單執行緒的WASM解碼模式,還有多執行緒WASM SIMD模式,效率上差距也是不小的;
解決方案
- 我們採用了H.265+AAC(音訊透過轉碼統一成了AAC編碼格式)封裝成FLV格式,然後再透過WebRTC的DataChannel方式,傳輸到客戶端;
WebRTC有VideoChannel、AudioChannel和DataChannel,原來DataChannel只是為了傳輸一些私有資訊,現在也用來傳輸影片資料了,效果挺好!
- DataChannel傳輸到客戶端之後,回撥到上層進行類似於HTTP-FLV或者WebSocket-FLV的模式,選擇MSE硬體、WebCodecs硬解,或者選擇WASM軟解碼的方式,進行解碼;
- WebRTC的DataChannel可以透過UDP或者TCP進行傳輸,完全利用了WebRTC的高效QoS策略,使用者只需要做好服務端的FLV封裝和客戶端的FLV解碼播放就可以了!!!
效果如圖: