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

React Native中Expo-AV本地音频无法播放问题求助

解决Expo 46中expo-av无法播放本地音频的问题

问题排查与修复步骤

1. 移除重复的播放触发

你的代码中Audio.Sound.createAsync已设置shouldPlay: true,紧接着调用sound.playAsync()会导致重复触发播放请求,干扰音频加载流程。修改playSound函数:

async function playSound() {
  console.log('Loading Sound')
  try {
      const { sound } = await Audio.Sound.createAsync(
        require('./uno.mp3'),
        { shouldPlay: true }
      );
      
      setSound(sound);
      console.log('Playing Sound');

      // 可选:监听播放状态,确认音频状态
      sound.setOnPlaybackStatusUpdate(status => {
        if (status.isPlaying) {
          console.log('音频正在播放');
        } else if (status.didJustFinish) {
          console.log('播放结束');
        }
      });
  } catch (error) {
    console.error('音频加载/播放错误:', error);
  }
}

2. 验证音频文件有效性

  • 确认uno.mp3在当前组件同级目录,文件名大小写与代码完全匹配(iOS系统严格区分大小写)
  • 替换为已知可用的MP3文件测试,排除原文件损坏的可能
  • 确保文件格式为Expo支持的类型:MP3、AAC、WAV等

3. 添加音频权限请求

部分平台(如Android 11+)需要明确授权音频权限,在组件初始化时添加权限请求:

import { Audio } from 'expo-av';

useEffect(() => {
  async function requestPermissions() {
    const { status } = await Audio.requestPermissionsAsync();
    if (status !== 'granted') {
      console.log('需授予音频播放权限');
    }
  }
  requestPermissions();
}, []);

4. 完善资源清理逻辑

原清理函数未处理unloadAsync的异步操作,可能导致资源泄漏,修改为:

useEffect(() => {
  return sound
    ? async () => {
        console.log('Unloading Sound');
        await sound.unloadAsync();
      }
    : undefined;
}, [sound]);

5. 修复依赖安装问题

若之前出现兼容性错误,执行以下操作重置依赖:

  1. 删除node_modules和package-lock.json(或yarn.lock)
  2. 重新执行npm install或yarn install
  3. 用expo start -c清除缓存后重启项目

测试建议

  • 优先在真机上测试,避免模拟器音频兼容性问题
  • 查看完整Expo日志,排查隐藏的警告或错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 21:22:40