dart - Flutter 中的音频播放器插件 - 无法加载资产
问题描述
我正在尝试在 Flutter 中创建一个警报,其中警报音应该在一定时间后响起。在 Flutter 中,这似乎说起来容易做起来难!
试图使用音频播放器插件来实现这一点。使用 playLocal 函数,其中资产从 rootbundle 加载到应用程序目录中,然后播放
根据 audioplayer github repo 中的答案,这是可以解决问题的代码:
class SoundManager {
AudioPlayer audioPlayer = new AudioPlayer();
Future playLocal(localFileName) async {
final dir = await getApplicationDocumentsDirectory();
final file = new File("${dir.path}/$localFileName");
if (!(await file.exists())) {
final soundData = await rootBundle.load("assets/$localFileName");
final bytes = soundData.buffer.asUint8List();
await file.writeAsBytes(bytes, flush: true);
}
await audioPlayer.play(file.path, isLocal: true);
}
}
我不断收到错误消息:“无法加载资产”。资产(mp3/wav 文件)显然在文件夹中,并且该文件夹正确包含在 pubspec.yaml 文件中(其他图像资产正在从该文件夹正确加载,因此指定文件夹本身不是这里的问题)
解决方案
您可以使用另一个音频库https://pub.dev/packages/audioplayers
音频缓存文档。 https://github.com/luanpotter/audioplayers/blob/master/doc/audio_cache.md
简单的例子:
import 'package:audioplayers/audio_cache.dart';
AudioCache player = AudioCache();
player.play('sounds/test_sound.m4a');
在此示例中,我的资产文件夹如下所示: assets/sounds/test_sound.m4a
该库将音频缓存为本地文件,然后播放音频
PS:如果你想从本地文件播放音乐,你可以使用 AudioPlayer()。
我的示例返回监听器,音乐结束时将调用 onPlayCompletion
AudioPlayer _advancedPlayer = AudioPlayer();
Stream<void> playFromLocal(int unitId, int id) {
var link = '/media/$unitId/words/$id.m4a';
_advancedPlayer.stop();
_advancedPlayer.release();
_advancedPlayer = AudioPlayer();
_advancedPlayer.play(Const.basePath + link, isLocal: true);
return _advancedPlayer.onPlayerCompletion;
}
推荐阅读
- c# - “事件处理程序应具有正确的签名”规则的基本原理是什么
- javascript - 验证动态附加的文本框字段-jQuery
- grails - 如何使用其他域对象启动 Grails 域类
- twig - Timber - WooCoommerce 电子邮件模板
- c# - 线程、任务、状态,需要帮助选择正确的
- android - Android Room 数据库 RxAndroid,异常:java.lang.IllegalStateException:无法访问主线程上的数据库,因为
- reactjs - 如何在 Reactjs 中从 Firebase Firestore 导入 FieldValue.increment()?
- r - 如何在 gganimate 中固定绘图的宽度?
- arrays - 从对象数组中删除重复对象
- javascript - ncaught TypeError:无法读取 null 的属性“getElementsByTagName”