Flutter中如何使用Audioplayers播放音频 作者: 灯小笼 时间: 2019-07-21 分类: 开发 目前在flutter中,并没有官方提供的音频播放插件,因此,需要我们自己去寻找第三方的widget或者自己开发。在google的时候,如果搜索“flutter audio”,那么出来的第一条结果一般都是“[audioplayers | Flutter Package - Dart Pub](https://pub.dev/packages/audioplayers "audioplayers | Flutter Package - Dart Pub")”。本文主要是翻译该项目的说明文件,用来简化大家对它的理解。 原文地址:https://github.com/luanpotter/audioplayers/blob/master/README.md # AudioPlayers 一个可用来同时播放多个音频文件的Flutter插件,兼容Android和iOS。 ![](https://c.dengxiaolong.com/blog/typecho/1563680826.png-typecho) ## 安装 这个项目是从[rxlabz的audioplayer](https://github.com/rxlabz/audioplayer "rxlabz的audioplayer")项目fork出来的,名字改成了`audioplayers`。使用前需要在`pubspec.yaml`文件中增加如下依赖: ```yaml dependencies: audioplayers: ^0.13.1 ``` ## Discord频道 官方在Fireslime的discord提供了一个[交流的频道](https://discord.gg/ny7eThk "交流的频道"),可以一起参与进来。 ## 疑难问题 在提交issue前,请先看一下[疑难解答](https://github.com/luanpotter/audioplayers/blob/master/troubleshooting.md "疑难解答")。 ## 用法 一个`AudioPlayer`示例只能同时播放一个音频。可以简单通过构造函数初始化: ```dart AudioPlayer audioPlayer = AudioPlayer(); ``` 要使用低延迟API(非常适合游戏音频),可以增加`mode`参数的设置: ```dart AudioPlayer audioPlayer = AudioPlayer(mode: PlayerMode.LOW_LATENCY); ``` 在这种模式下,后台不会对总长度和播放位置进行相应通知。当然,也不能通过寻址的方式从某个特殊位置开始播放。 你可以创建多个实例用来同时播放多个音频。 对于所有方法而言,返回类型都是Future,用来表示操作的状态。如果是`1`,表示操作成功,否则将返回平台相关的错误码。 默认情况下,日志是被禁用的。如果需要调试,可以增加相应设置: ```dart AudioPlayer.logEnabled = true; ``` ## 播放音频 音频的资源有三种可能性: 1. 互联网上的远程文件; 2. 用户设备上的本地文件; 3. Flutter项目的本地资源。 对于远程和本地文件而言,都使用`play`方法即可,只需要设置匹配的`isLocal`标识即可。 对于本地资源,你需要使用`AudioCache`这个类(而不是`AudioPlayer`,后面会有介绍)。 要播放一个远程文件,调用`call`方法时将网址传入即可(`isLocal`参数默认为false): 如果你需要长时间播放音频,你需要根据情况设置参数`stayAwake`。当`stayAwake`参数为`true`,你需要在manifest增加权限: ```xml ``` ```dart play() async { int result = await audioPlayer.play(url); if (result == 1) { // success } } ``` 如果是本地文件,则需要设置`isLocal`参数: ```dart playLocal() async { int result = await audioPlayer.play(localPath, isLocal: true); } ``` `isLocal`参数必须设置,是因为在iOS有一些不同(Android没有任何区别)。 你可以通过调用`setVolume`方法在任意时间调整音量。 ## 控制 正在播放的时候,你可以通过`pause`、`stop`和`seek`方法控制音频。 `pause`用来暂停播放,但会保留播放位置。随后调用`play`将继续从暂停的位置开始播放。 ```dart int result = await audioPlayer.pause(); ``` `stop`方法将停止音频的播放,且将播放位置重置。随后再调用`play`时将从开始位置播放。 ```dart int result = await audioPlayer.stop(); ``` 最后,使用`seek`方法用来对音频进行跳转。 ```dart int result = await audioPlayer.seek(Duration(milliseconds: 1200)); ``` 然后,你也可以使用`resume`方法(和`play`类型,但是不需要新参数): ```dart int result = await audioPlayer.resume(); ``` ## 精细控制 默认情况下,一旦音频播放完毕,或者`stop`方法被调用后,播放器将被释放。 这是因为在Android平台,一个`MediaPlayer`实例占用的资源很多,如果你播放大量音频不释放掉将会导致性能问题。 对于iOS来说不会申请资源,因此释放也不用做什么事情。 你可以修改释放模式,进而改变`MediaPlayer`结束或停止后的行为。有三个选项: 1. `RELEASE`:默认模式,结束或停止后将被释放。 2. `STOP`:永远不会被释放;需要尽快调用`play`方法。 3. `LOOP`:永远不会被释放;当完成后,会循环播放。 如果不是在`RELEASE`模式,你需要自己调用`release`方法。比如: ```dart await audioPlayer.setUrl('clicking.mp3'); // prepare the player with this audio but do not start playing await audioPlayer.setReleaseMode(ReleaseMode.STOP); // set release mode so that it never releases // 点击按钮时 await audioPlayer.resume(); // 快速播放声音,不会释放 // 退出屏幕时 await audioPlayer.release(); // 不需要时手动释放 ``` 尽管Android的`MediaPlayer`的状态图很复杂,但是`AudioPlayer`实例永远不应该有无效(invalid)的状态。即使它被释放,如果`resume`被调用,数据也会被重新拉取。 ## 流 `AudioPlayer`支持订阅这样的事件: ### 时长事件 当文件可用时,此事件返回文件的时长(可能需要等待一段时间,因为正在下载或缓冲文件)。 ```dart player.onDurationChanged.listen((Duration d) { print('Max duration: $d'); setState(() => duration = d); }); ``` ### 位置事件 此事件更新音频的当前播放位置。例如,你可以使用它来创建一个进度条。 ```dart player.onAudioPositionChanged.listen((Duration p) => { print('Current position: $p'); setState(() => position = p); }); ``` ### 状态事件 此事件返回当前播放器状态。你可以用它来显示播放器是否在播放,或停止,或暂。 ```dart player.onPlayerStateChanged.listen((AudioPlayerState s) => { print('Current player state: $s'); setState(() => palyerState = s); }); ``` ### 完成状态 当音频结束播放时调用此事件。例如,它在`loop`方法中使用。 当使用`pause`或者`stop`方法中断播放时不会产生该事件。 ```dart player.onPlayerCompletion.listen((event) { onComplete(); setState(() { position = duration; }); }); ``` ### 错误事件 当在本地代码中抛出意外错误时,将调用此函数。 ```dart player.onPlayerError.listen((msg) { print('audioPlayer error : $msg'); setState(() { playerState = PlayerState.stopped; duration = Duration(seconds: 0); position = Duration(seconds: 0); }); }); ``` ## AudioCache 为了播放本地资源,你必须使用AudioCache类。 Flutter并没有提供对资源播放音频的简单方法,而这个类则提供了相应的方法。它实际上会将资源复制到设备中的一个临时文件夹中,然后将其作为本地文件播放。 它跟踪复制出来的文件,以缓存的形式工作,以便你可以毫不延迟地重播它们。 你可以在[这里](https://dengxiaolong.com/article/2019/07/using-audiocache-to-play-source-audio-files-in-flutter.html)查看它的详细文档。 ## 支持格式 你可以查看以下支持的格式列表: - \[[Android](https://developer.android.com/guide/topics/media/media-formats.html)\] - \[[iOS](http://www.techotopia.com/index.php/Playing_Audio_on_iOS_8_using_AVAudioPlayer#Supported_Audio_Formats)\] ## ⚠️ iOS应用安全传输 默认情况下,iOS禁止从非https的网址加载。要取消此限制,你必须编辑.pl ```xml NSAppTransportSecurity NSAllowsArbitraryLoads ``` 标签: flutter, audioplayers, audio
过来看看,学习学习