首页 > 解决方案 > 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 文件中(其他图像资产正在从该文件夹正确加载,因此指定文件夹本身不是这里的问题)

标签: dartflutter

解决方案


您可以使用另一个音频库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;

}


推荐阅读