WebRTC在SDP協(xié)商后會(huì)默認(rèn)打開手機(jī)的音頻資源,這中體驗(yàn)不友好,因此需要對(duì)源碼進(jìn)行改動(dòng),如下為需要更改的流程:
RTCAudioTrack->RTCAudioSource->RTCRemoteAudio->AudioRtpReceiver->WebRtcVoiceMediaChannel->WebRtcVoiceEngine->AudioDeviceModuleIOS->AudioDeviceIOS->VoiceProcessingAudioUnit
首先需要對(duì)VoiceProcessingAudioUnit進(jìn)行更改,防止WebRTC直接開啟麥克風(fēng),如下所示:
1、VoiceProcessingAudioUnit::Init()該方法內(nèi)部會(huì)開啟AudioUnit,注釋掉其內(nèi)容
2、VoiceProcessingAudioUnit::Initialize(Float64 sample_rate)記住采樣率即可,其他實(shí)現(xiàn)注釋掉
3、新增方法SetupAudioUnit(初始化蘋果的音頻單元),SetupCapture(配置麥克風(fēng)),SetupPlay(配置外放)
4、新增外部接口SetSpeakMute來控制麥克風(fēng)是否需要啟用,iOS中并不能單獨(dú)的開關(guān)麥克風(fēng),每次開關(guān)都需要把整個(gè)音頻單元卸載重新初始化,如下實(shí)現(xiàn):

接下來主要實(shí)現(xiàn)上層如何調(diào)用到底層,WebRTC在創(chuàng)建的時(shí)候會(huì)生成RTCAudioTrack,本人是直接對(duì)track中的isEnable進(jìn)行更改,其中isEnable源碼已經(jīng)寫好,只需要在中間截取就好。OC配置isEnable的時(shí)候會(huì)通過source走到WebRtcVoiceMediaChannel::MuteStream,源碼默認(rèn)的實(shí)現(xiàn)方式是靜音的時(shí)候會(huì)把rtp的數(shù)據(jù)變成0,發(fā)0音頻到對(duì)端。在WebRtcVoiceEngine新增SetSpeakMute實(shí)現(xiàn),在MuteStream中調(diào)用SetSpeakMute,如下所示:

再通過AudioDeviceModuleIOS->AudioDeviceIOS->VoiceProcessingAudioUnit一層層往下實(shí)現(xiàn),具體方法不貼出。
后續(xù)音頻的控制走向都可以按照該流程來實(shí)現(xiàn),本人還實(shí)現(xiàn)了是否開啟外放、降噪配置、增益配置等,都可以從Track新增方法一層層實(shí)現(xiàn)。
至此iOS的麥克風(fēng)資源占用問題就此解決。Android的后續(xù)貼出