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

Flutter使用audioplayers播放assets音频失败,求助解决方法

修复Flutter音频播放失败的问题

核心问题排查与修复

1. 替换错误的文件源类型

你当前使用的DeviceFileSource适用于设备本地文件,而assets/voices/en.mp3是应用打包时内置的资源文件,需改用AssetSource,且路径无需带assets/前缀:

player.play(AssetSource("voices/en.mp3"));

2. 配置pubspec.yaml声明资源

打开项目根目录的pubspec.yaml,确保正确声明assets路径(注意缩进要与flutter:对齐):

flutter:
  assets:
    - assets/voices/

末尾的斜杠表示包含该目录下所有文件,若只指定单个文件可写- assets/voices/en.mp3。

3. 增加错误捕获与日志

在播放逻辑中加入异常捕获,打印错误信息便于定位问题:

onPressed: () async {
  try {
    await player.play(AssetSource("voices/en.mp3"));
  } catch (e) {
    print("播放错误:$e");
  }
},

4. 优化AudioPlayer生命周期(推荐)

在StatelessWidget中直接初始化AudioPlayer可能导致资源泄漏,建议改用StatefulWidget并在组件销毁时释放资源:

class AudioButton extends StatefulWidget {
  const AudioButton({super.key});

  @override
  State<AudioButton> createState() => _AudioButtonState();
}

class _AudioButtonState extends State<AudioButton> {
  late final AudioPlayer player;

  @override
  void initState() {
    super.initState();
    player = AudioPlayer();
  }

  @override
  void dispose() {
    player.dispose(); // 释放音频资源
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      style: ElevatedButton.styleFrom(
        backgroundColor: OkPrimaryColor,
      ),
      onPressed: () async {
        try {
          await player.play(AssetSource("voices/en.mp3"));
        } catch (e) {
          print("播放错误:$e");
        }
      },
      child: const Padding(
        padding: EdgeInsets.symmetric(vertical: 15, horizontal: 30),
        child: okWord(fontSize: 23),
      ),
    );
  }
}

额外检查项

  • 确认assets/voices/en.mp3文件真实存在,路径大小写与代码、pubspec配置完全一致(Flutter对路径大小写敏感)
  • 执行flutter clean清除缓存后,再运行flutter run重新打包资源

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 05:17:04