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

如何修复iOS端Expo AV中AVPlayerItem错误码-11828(AVFoundationErrorDomain)

解决Expo AV在iOS上无法播放Base64 MP3的问题

核心问题分析

iOS的AVFoundation对data:audio/mp3;base64,...这类直接的Data URI支持存在限制,即便Android能正常解析,iOS也会因格式兼容性问题抛出-11828错误(媒体格式不支持)。

可行解决方案

方案1:将Base64转为本地文件再播放

通过Expo File System把Base64字符串写入本地临时文件,再通过本地文件路径播放,这是iOS上最可靠的处理方式。

  1. 安装依赖(未安装的话):
expo install expo-file-system
  1. 修改播放函数:
import * as FileSystem from 'expo-file-system';
import { Audio } from 'expo-av';

async function playAudio(dataString: string) {
  try {
    setIsPlaying(true);
    
    // 配置音频模式(建议放在组件挂载时初始化,无需每次播放重复调用)
    await Audio.setAudioModeAsync({
      playsInSilentModeIOS: true,
      staysActiveInBackground: false,
      interruptionModeAndroid: Audio.INTERRUPTION_MODE_ANDROID_DO_NOT_MIX,
      shouldDuckAndroid: false,
      allowsRecordingIOS: false, // 避免iOS占用录音资源导致冲突
    });

    // 将Base64写入本地临时文件
    const filePath = `${FileSystem.cacheDirectory}temp_audio.mp3`;
    await FileSystem.writeAsStringAsync(filePath, dataString, {
      encoding: FileSystem.EncodingType.Base64,
    });

    // 通过本地文件路径创建Sound实例
    const { sound } = await Audio.Sound.createAsync(
      { uri: filePath },
      { shouldPlay: true },
      onPlaybackStatusUpdate
    );
    await sound.setRateAsync(0.85, true);
    setAIResponse(sound);

    // 播放结束后清理临时文件(可选)
    sound.setOnPlaybackStatusUpdate((status) => {
      if (status.didJustFinish) {
        FileSystem.deleteAsync(filePath).catch(() => {});
        setIsPlaying(false);
      }
    });
  } catch (e) {
    console.error(e);
    setIsPlaying(false);
  }
}

方案2:检查并修复MP3编码兼容性

如果Base64对应的MP3使用了iOS不支持的编码格式(比如非标准VBR编码、过高/过低采样率),可以将音频转成iOS兼容的标准MP3:

  • 用FFmpeg等工具将音频转码为:采样率44.1kHz/48kHz、比特率128kbps/256kbps的CBR编码MP3
  • 重新生成Base64字符串后测试播放

方案3:确保Audio模块正确初始化

在组件挂载阶段提前完成音频模式初始化,避免每次播放时重复调用:

useEffect(() => {
  async function initAudio() {
    await Audio.setAudioModeAsync({
      playsInSilentModeIOS: true,
      allowsRecordingIOS: false,
    });
  }
  initAudio();

  // 组件卸载时清理Sound实例,避免内存泄漏
  return () => {
    if (AIResponse) {
      AIResponse.unloadAsync();
    }
  };
}, []);

内容的提问来源于stack exchange,提问作者dallin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 10:33:21