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. 修复依赖安装问题
若之前出现兼容性错误,执行以下操作重置依赖:
- 删除
node_modules和package-lock.json(或yarn.lock) - 重新执行
npm install或yarn install - 用
expo start -c清除缓存后重启项目
测试建议
- 优先在真机上测试,避免模拟器音频兼容性问题
- 查看完整Expo日志,排查隐藏的警告或错误
内容的提问来源于stack exchange,提问作者Robert Garofalo
相关产品推荐
相关产品推荐

