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

iOS端React Native用react-native-sound播放Documents目录MP3失败求助

解决iOS React Native中react-native-sound播放Documents目录MP3无响应问题

核心问题分析

react-native-sound默认优先读取应用bundle内的资源,直接传入沙盒路径时,需要明确告知库这是本地文件系统路径,否则会加载失败但无明确报错。此外,URL格式错误(如file:/而非file://)也会导致无法识别文件。

修复步骤

  • 使用正确的文件URL格式:给沙盒路径添加完整的file://前缀,确保iOS能正确识别本地文件。
  • 初始化Sound时指定本地文件模式:Sound构造函数的第二个参数是bundle资源的目录名,加载本地文件时传空字符串'',让库跳过bundle资源查找逻辑。
  • 确保音频会话配置生效:Sound.setCategory需在Sound实例初始化前调用,且确认配置符合播放需求。

修正后的代码

const playMP3 = async (songPath) => {
  // 先配置音频会话,确保在初始化Sound前执行
  Sound.setCategory('Playback', true); // true = mixWithOthers

  console.log("目标文件路径:", songPath);

  // 构造正确的file://格式URL
  const fileUrl = `file://${songPath}`;
  console.log("完整文件URL:", fileUrl);

  try {
    const exists = await RNFS.exists(songPath);
    if (exists) {
      console.log("文件存在,开始加载");

      // 初始化Sound:第一个参数是完整file URL,第二个参数传空字符串表示本地文件
      const whoosh = new Sound(fileUrl, '', (error) => {
        if (error) {
          console.error('加载音频失败:', error);
          return;
        }
        // 加载成功,打印音频信息
        console.log(
          `音频时长: ${whoosh.getDuration()}秒,声道数: ${whoosh.getNumberOfChannels()}`
        );

        // 开始播放
        whoosh.play((success) => {
          if (success) {
            console.log('播放完成');
            // 播放结束后释放资源,避免内存泄漏
            whoosh.release();
          } else {
            console.error('播放失败:音频解码错误');
            whoosh.release();
          }
        });
      });
    } else {
      console.log("文件不存在");
    }
  } catch (error) {
    console.error("检查文件时出错:", error);
  }
};

额外注意事项

  • 播放完成后调用whoosh.release()释放音频资源,避免内存泄漏。
  • 若仍无响应,可检查MP3文件本身是否损坏:将文件从设备导出到电脑,验证是否能正常播放。
  • 确认iOS权限:虽然播放本地文件不需要额外权限,但如果是从网络下载的文件,需确保文件写入Documents目录时没有权限问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:52:46