为了这一整套的解决方案,调研+研发整整花费了差不多半年多的时间,需达成的目标:
- 流媒体服务器端不需要将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解码播放就可以了!!!
效果如图: