React Native Expo 音频无法在 iOS 上播放

问题描述 投票:0回答:3

我正在尝试构建一个简单的音频播放器,从我们的服务器加载文件并播放它。目前这段代码可以在 Android 上运行,但 iOS 上不行,会抛出错误

AVPlayerItem 实例失败,错误代码为 -11850,域为“AVFoundationErrorDomain”

根据我收集的信息,这是 iOS 在尝试加载音频文件时需要文件扩展名的问题。我们在 React Web 应用程序上使用完全相同的服务器路由,没有任何问题,它能够在简单的音频 html 元素中加载文件。 Android 也可以使用下面的 React Native 代码运行:

const loadNewPlaybackInstance = async playing => {
  const source = { uri: url } // defined as `${api}/api/v1/voicemail?s3_email_id=${s3_email_id}`
  // This returns a voicemail.wav file 

  const initialStatus = {
    shouldPlay: playing,
    rate: 1.0,
    volume: volume,
    isMuted: false,
  }

  try {
    const { sound } = await Audio.Sound.createAsync(
      source,
      initialStatus,
      onPlaybackStatusUpdate,
    )
    setPlaybackInstance(sound)

    updateScreenForLoading(false)
  } catch (error) {
    console.error(error.message)
  }
}

我发现了另一个SO问题,但没有真正的答案。

Github 上还有一个未解决的问题,似乎被遗忘了,我也尝试过恢复。

有人知道如何解决这个问题吗?如果需要更多细节/上下文来帮助我,请告诉我。

ios react-native expo avaudioplayer expo-av
3个回答
2
投票

更改 setAudioModeAsync 后我遇到了同样的问题 扬声器开始播放音频。

配置是这样的:

await Audio.requestPermissionsAsync();
await Audio.setAudioModeAsync({
  staysActiveInBackground: true,
  interruptionModeAndroid: Audio.INTERRUPTION_MODE_ANDROID_DO_NOT_MIX,
  shouldDuckAndroid: false,
  playThroughEarpieceAndroid: false,
  allowsRecordingIOS: false,
  interruptionModeIOS: Audio.INTERRUPTION_MODE_IOS_DO_NOT_MIX,
  playsInSilentModeIOS: true,
});

0
投票

请在播放声音视图“expo-av”之前添加此方法,并在调用该方法之前检查 Platform.OS==="ios"

const enableAudio = async () => {
await Audio.setAudioModeAsync({
playsInSilentModeIOS: true,
staysActiveInBackground: false,
interruptionModeAndroid: INTERRUPTION_MODE_ANDROID_DO_NOT_MIX,
shouldDuckAndroid: false,

})


0
投票

我尝试了上述所有解决方案,但它在我的 iOS 设备上不起作用。 下面的代码片段对我有用。

    const sound = useRef(new Audio.Sound()); // Add this at the beginning of the component.

    if(Platform.OS === 'ios'){
        await Audio.setAudioModeAsync({
            allowsRecordingIOS: false,
            playsInSilentModeIOS: true,
        });      
        await sound.current.playAsync();
    }
© www.soinside.com 2019 - 2024. All rights reserved.