You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 16:36:43