繁体   English   中英

Flutter 中的音频播放器插件 - 无法加载资产

[英]audioplayer plugin in Flutter - Unable to load asset

我正在尝试在 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;

}

这适用于 iOS 和 Android。 注意:如果本地不可用,则从 url 下载。

AudioProvider audioProvider;
_playSound() async {
    audioProvider = AudioProvider("http:...");
    var soundToPlay = "myLocalSound";
    String localUrl = await audioProvider.load(soundToPlay);
    SoundController.play(localUrl);
  }
}

audio_provider.dart

import 'dart:async';
import 'dart:io';
import 'dart:typed_data';
import 'package:path_provider/path_provider.dart';
import 'package:http/http.dart';

typedef void OnError(Exception exception);

class AudioProvider {
  String url;
  AudioProvider(String url) {
    this.url = url;
  }

  Future<Uint8List> _loadFileBytes(String url, {OnError onError}) async {
    Uint8List bytes;
    try {
      bytes = await readBytes(url);
    } on ClientException {
      rethrow;
    }
    return bytes;
  }

  Future<String> load(fileName) async {
    final dir = await getApplicationDocumentsDirectory();
    final file = new File('${dir.path}/$fileName');
    if (await file.exists()) {print("file exists");
      return file.path;
    }
    var filePath = url +fileName;
    final bytes = await _loadFileBytes(filePath,
        onError: (Exception exception) =>
            print('audio_provider.load => exception ${exception}'));
    await file.writeAsBytes(bytes);
    if (await file.exists()) {
      return file.path;
    }
    return '';
  }
}

soundController.dart

import 'package:flutter/foundation.dart';
import 'package:audioplayers/audio_cache.dart';
import 'package:audioplayers/audioplayers.dart';
import 'dart:io' show Platform;


void audioPlayerHandler(AudioPlayerState value) => null;

class SoundController {

  static AudioPlayer audioPlayer = AudioPlayer(mode: PlayerMode.LOW_LATENCY);
  static AudioCache audioCache = AudioCache(prefix: "assets/audio/", fixedPlayer: audioPlayer);

  static void play(String sound) {

    if (!kIsWeb && Platform.isIOS) {
      audioPlayer.monitorNotificationStateChanges(audioPlayerHandler);
    }
    audioPlayer.play(sound, isLocal: true);
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM