Flutter使用FlameAudio播放背景音乐报资源加载失败错误
问题原因
- 核心错误是路径拼接重复:
flame_audio包默认会给所有传入的音频资源路径自动拼接前缀assets/audio/,你代码里传入的路径是assets/Sound3.mp3,最终实际加载的路径就变成了报错信息里的assets/audio/assets/Sound3.mp3,和你在pubspec.yaml里配置的资源路径完全不匹配,因此加载失败。 - 自动播放逻辑缺失:你当前的播放代码写在了
onTapUp点击回调中,必须用户点击屏幕才能触发播放,没有实现应用启动后自动触发的逻辑。 - 补充系统策略限制:现代浏览器、iOS/安卓移动端系统默认禁止无用户交互的媒体自动播放,这是系统级安全策略,无法完全绕过,桌面端应用一般无此限制。
修复方案
1. 调整资源目录与pubspec配置
按照flame_audio的官方约定调整文件位置,避免路径问题:
- 在项目的
assets目录下新建audio文件夹,把Sound3.mp3文件移动到assets/audio/路径下 - 修改
pubspec.yaml的资源配置,严格注意yaml缩进(必须用2空格缩进,不能用tab,否则配置不生效):
flutter: # 其他原有配置比如uses-material-design: true保留 assets: - assets/audio/Sound3.mp3
配置修改完成后执行flutter pub get同步依赖,建议额外执行flutter clean清理旧的构建缓存,避免缓存导致的资源加载异常。
2. 修改业务代码
修正播放路径,同时在onLoad生命周期中添加自动播放逻辑,保留点击兜底应对移动端/网页端的自动播放限制:
import 'package:flutter/material.dart'; import 'package:flame/game.dart'; import 'package:flame/input.dart'; import 'package:flame_audio/flame_audio.dart'; import 'package:flutter/widgets.dart'; void main() { runApp(GameWidget(game: BgmTestGame())); } class BgmTestGame extends FlameGame with TapDetector { @override Future<void> onLoad() async { super.onLoad(); // 直接传音频文件名即可,flame_audio会自动补全默认路径前缀 // 桌面端会直接启动播放,移动端/网页端如果被系统拦截,用户首次点击屏幕后会触发兜底播放 FlameAudio.bgm.play('Sound3.mp3'); } @override void onTapUp(TapUpInfo info) { // 兜底逻辑:如果BGM没在播放,点击时触发播放,适配移动端/网页端的自动播放限制 if (!FlameAudio.bgm.isPlaying) { FlameAudio.bgm.play('Sound3.mp3'); } } }
如果你不想调整音频文件的存放位置,也可以在调用播放方法前手动修改flame_audio的默认路径前缀,在
onLoad开头添加代码:FlameAudio.audioCache.prefix = 'assets/';,之后播放时直接传入文件名Sound3.mp3即可正常加载,不过更推荐使用官方约定的目录结构,减少后续路径配置问题。
内容的提问来源于stack exchange,提问作者user19402977
相关产品推荐
相关产品推荐

