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

Flutter使用audioplayers播放音频报错soundID not READY如何解决?

问题根因

你遇到的报错本质是LOW_LATENCY模式依赖的SoundPool组件在资源未完成加载时就收到了播放请求,同时缓存的soundId复用状态异常,你的代码存在两处典型问题:

  1. player.load()是异步方法,你没有做等待处理,资源加载完成前触发播放就会报not READY错误
  2. 静态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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 14:27:02