Flutter使用audioplayers播放音频报错soundID not READY如何解决?
问题根因
你遇到的报错本质是LOW_LATENCY模式依赖的SoundPool组件在资源未完成加载时就收到了播放请求,同时缓存的soundId复用状态异常,你的代码存在两处典型问题:
player.load()是异步方法,你没有做等待处理,资源加载完成前触发播放就会报not READY错误- 静态AudioCache实例未在页面销毁时释放资源,重复进入页面复用旧资源id就会报
Reusing soundId错误
修复方案
- 方案1:添加加载状态判断,等待资源加载完成后再允许播放,同时增加资源释放逻辑
import 'package:audioplayers/audioplayers.dart'; ... class _HomeState extends State<Home> { // 不建议用static修饰,避免跨页面状态异常 AudioCache player = AudioCache(); bool _isSoundReady = false; @override void initState() { super.initState(); _initSound(); } Future<void> _initSound() async { try { await player.load('timer.mp3'); _isSoundReady = true; } catch (_) { _isSoundReady = false; } } void _playSound() { if (_isSoundReady) { player.play('timer.mp3', mode: PlayerMode.LOW_LATENCY, volume: 1); } } @override void dispose() { // 页面销毁时清空缓存的音频资源,避免状态残留 player.clear('timer.mp3'); super.dispose(); } ... }
- 方案2:如果你的音频是短音效,无需提前预加载,可直接删除initState里的load逻辑,audioplayers的play方法内部会自动完成资源加载和播放
- 方案3:如果使用的是audioplayers 1.0及以上版本,API发生了变更,play方法需要传入资源包装类而非直接传字符串路径,修改如下:
// 1.0+版本play方法示例 player.play(AssetSource('timer.mp3'), mode: PlayerMode.LOW_LATENCY, volume: 1);
- 兜底排查:如果上述方案都无效,可卸载重装应用清除本地缓存,部分损坏的缓存资源也会导致该类加载异常
内容的提问来源于stack exchange,提问作者Codeopold
相关产品推荐
相关产品推荐

