iOS14/Xcode12.2下webRTC通话用react-native-video致麦克风异常静音问题
webRTC通话中react-native-video导致本地流异常静音(iOS14/Xcode12.2)修复方案
核心根因
该问题并非webRTC音频轨道被实际静音(轨道enabled属性始终为true),本质是react-native-video在初始化、静音状态切换时,会主动修改全局AVAudioSession配置,把webRTC通话依赖的PlayAndRecord + VoiceChat会话模式覆盖为纯播放模式,直接切断系统层的麦克风采集路由,最终表现为本地流异常静音。
修复方案
- 组件层配置约束
- 通话场景下挂载的Video组件,配置
mixWithOthers={true}属性,禁止Video以独占模式激活音频会话,从根源上避免其覆盖webRTC已经建立的会话配置 - 通话过程中不要直接修改Video原生
muted属性:如需实现视频静音效果,切换时直接将Video绑定的音频轨道置空,让组件全程不触发音频会话初始化逻辑,绕开组件对会话配置的修改动作 - 原生层适配补丁
- 维护全局webRTC通话状态标记,修改react-native-video原生端
RCTVideo类的音频会话配置逻辑:当检测到当前处于通话状态时,跳过所有AVAudioSession的category、mode、路由设置操作,直接复用webRTC已经配置完成的全局会话实例 - webRTC侧将音频会话配置切换为手动模式:每次Video组件完成播放、暂停、状态切换后,手动强制重新加载webRTC的音频会话配置,设置会话category为
AVAudioSessionCategoryPlayAndRecord、模式为AVAudioSessionModeVoiceChat,重新绑定当前麦克风采集路由,覆盖Video的错误配置 - 版本兼容调整
- 规避存在会话配置bug的react-native-video版本:iOS14环境下避开5.1.0~5.2.0版本区间,这些版本硬编码了播放时的会话category设置,会直接冲断webRTC的输入链路
- 针对Xcode12.2编译环境,额外配置会话优先级:将webRTC的
RTCAudioSession配置优先级设为高于系统默认媒体组件,避免外部组件的低优先级配置覆盖通话配置
方案逻辑匹配已知复现边界:
- Video组件
muted为true时不触发问题,是因为该状态下Video根本不会激活音频会话- 通话启动前已播放的视频不触发问题,是因为webRTC启动时会主动重写全局会话配置,覆盖提前初始化的Video会话配置
内容的提问来源于stack exchange,提问作者Franciszek Szombara
相关产品推荐
相关产品推荐

