React Native Expo AV iOS端如何设置录音通过主扬声器播放
问题原因
iOS系统音频会话在开启录音权限(allowsRecordingIOS: true)时,会默认将音频输出路由到顶部听筒,属于系统通话场景的默认路由逻辑。现有代码仅在开始录音时配置了音频模式,录音结束后没有切换回播放模式,也未开启扬声器默认输出配置,导致播放录音时沿用了录音阶段的听筒输出路由。
修复方案
不需要修改原生配置,仅需在JS层调整expo-av的音频模式配置即可:
- 录音结束后切换音频会话到播放模式,开启默认主扬声器输出
- (可选)播放前再次确认音频模式,避免路由异常
具体代码修改
1. 修改stopRecording方法
在执行stopAndUnloadAsync后、加载录音文件前,重新调用Audio.setAudioModeAsync切换配置:
async function stopRecording() { setRecording(undefined); await recording.stopAndUnloadAsync(); // 新增:切换为播放模式,强制音频默认输出到主扬声器 await Audio.setAudioModeAsync({ allowsRecordingIOS: false, // 关闭录音状态,退出系统听筒路由逻辑 playsInSilentModeIOS: true, // 保留原有静音模式可播放的配置 defaultToSpeaker: true, // iOS专属配置:默认将音频输出到手机主扬声器 // 可选配置:播放时打断其他后台音频,播放结束后恢复 // interruptionModeIOS: Audio.INTERRUPTION_MODE_IOS_DO_NOT_MIX, // shouldDuckAndroid: true, // interruptionModeAndroid: Audio.INTERRUPTION_MODE_ANDROID_DO_NOT_MIX, }); let updatedRecordings = [...recordings]; const { sound, status } = await recording.createNewLoadedSoundAsync(); updatedRecordings.push({ sound: sound, duration: getDurationFormatted(status.durationMillis), file: recording.getURI() }); setRecordings(updatedRecordings); }
2.(可选)播放前二次确认音频配置
如果需要避免应用切后台、其他音频App打断导致的路由异常,可以在播放按钮的回调中提前设置音频模式:
<Button style={styles.button} onPress={async () => { // 播放前再次确认输出到主扬声器 await Audio.setAudioModeAsync({ allowsRecordingIOS: false, playsInSilentModeIOS: true, defaultToSpeaker: true }) recordingLine.sound.replayAsync() }} title="Play"> </Button>
兼容说明
- 以上配置对Android端无副作用,Android系统默认会将媒体音频输出到主扬声器,后续在Android设备测试时无需额外调整
- 录音阶段系统默认走听筒是正常逻辑,不需要修改,只有播放阶段需要切换配置
内容的提问来源于stack exchange,提问作者sam rafiei
相关产品推荐
相关产品推荐

