处于公司对项目的特殊要求,WebRTC创建之后不让做释放,下次播放可复用,提高效率,不释放会引发两个问题:
1、视频解码器会被一直占用,iOS能够申请的解码器有限,摄像头一多,可能造成没法创建解码器问题
2、AudioUnit会被一直占用,对于该问题可参考解决方案https://www.jianshu.com/p/ac8ef80fc3e2
iOS实现:
本文主要针对问题1进行整改,WebRTC需要通过更改源码来支持从外部释放视频解码器来实现WebRTC不释放却能单独释放解码器,主要的更改流程如下:
RTCVideoTrack->RTCRtpTransceiver->RtpTransceiver->VideoRtpReceiver->WebRtcVideoChannel->VideoReceiveStream2->RTCVideoDecoderH265/RTCVideoDecoderH264
1、在RTCRtpTransceiver新增closeDecoder方法,如下所示:
2、RTCRtpTransceiver中的_nativeRtpTransceiver最终会调用到RtpTransceiver,RtpTransceiver新增实现方法,如下图所示:
调用该方法前需要注册下方法,否则调用不到,在头文件中添加PROXY_METHOD0(void, CloseDecoder)
3、WebRtcVideoChannel新增实现方法,如下图所示:
4、VideoReceiveStream2新增实现方法,如下图所示:
5、最终在OC的RTCVideoDecoderH264/RTCVideoDecoderH265实现closeDecoder来处理解码器释放
至此视频的解码器单独释放就此完成,中间还有很多的虚函数CloseDecoder没写,写虚函数时最好在虚函数实现空的实现,防止出现说一套源码iOS编译通过了,Android没法编译,主要写了主要的实现方法,释放后再进行拉流时会自动去创建解码器。
Android:后续输出