WebRTC在SDP协商后会默认打开手机的音频资源,这中体验不友好,因此需要对源码进行改动,如下为需要更改的流程:
RTCAudioTrack->RTCAudioSource->RTCRemoteAudio->AudioRtpReceiver->WebRtcVoiceMediaChannel->WebRtcVoiceEngine->AudioDeviceModuleIOS->AudioDeviceIOS->VoiceProcessingAudioUnit
首先需要对VoiceProcessingAudioUnit进行更改,防止WebRTC直接开启麦克风,如下所示:
1、VoiceProcessingAudioUnit::Init()该方法内部会开启AudioUnit,注释掉其内容
2、VoiceProcessingAudioUnit::Initialize(Float64 sample_rate)记住采样率即可,其他实现注释掉
3、新增方法SetupAudioUnit(初始化苹果的音频单元),SetupCapture(配置麦克风),SetupPlay(配置外放)
4、新增外部接口SetSpeakMute来控制麦克风是否需要启用,iOS中并不能单独的开关麦克风,每次开关都需要把整个音频单元卸载重新初始化,如下实现:
接下来主要实现上层如何调用到底层,WebRTC在创建的时候会生成RTCAudioTrack,本人是直接对track中的isEnable进行更改,其中isEnable源码已经写好,只需要在中间截取就好。OC配置isEnable的时候会通过source走到WebRtcVoiceMediaChannel::MuteStream,源码默认的实现方式是静音的时候会把rtp的数据变成0,发0音频到对端。在WebRtcVoiceEngine新增SetSpeakMute实现,在MuteStream中调用SetSpeakMute,如下所示:
再通过AudioDeviceModuleIOS->AudioDeviceIOS->VoiceProcessingAudioUnit一层层往下实现,具体方法不贴出。
后续音频的控制走向都可以按照该流程来实现,本人还实现了是否开启外放、降噪配置、增益配置等,都可以从Track新增方法一层层实现。
至此iOS的麦克风资源占用问题就此解决。Android的后续贴出
网友评论