美文网首页WebRTC
WebRTC占用麦克风问题(iOS&&Android)

WebRTC占用麦克风问题(iOS&&Android)

作者: BryanHong | 来源:发表于2022-12-16 11:25 被阅读0次

    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的后续贴出

    相关文章

      网友评论

        本文标题:WebRTC占用麦克风问题(iOS&&Android)

        本文链接:https://www.haomeiwen.com/subject/xcmdqdtx.html