AudioPlayers

一个 Flutter 插件,用于同时播放多个音频文件,适用于 Android 和 iOS。

安装

此项目最初是基于 rxlabz 的 audioplayer 分叉的,但名称已更改为 audioplayers(注意后面的 's');因此,要添加依赖项

dependencies:
  audioplayers: ^0.8.0

用法

一个 AudioPlayer 实例一次只能播放一个音频。要创建它,只需调用构造函数

    AudioPlayer audioPlayer = new AudioPlayer();

您可以创建多个实例来同时播放音频。

对于所有返回 Future<int> 的方法:这是操作的状态。如果为 1,则操作成功。否则,它是平台原生错误代码。

日志默认是禁用的!要调试,请运行

  AudioPlayer.logEnabled = true;

播放音频

音频有三种可能的来源

  • 互联网上的远程文件
  • 用户设备上的本地文件
  • Flutter 项目中的本地资源

对于远程文件或本地文件,请使用 play 方法,只需正确设置 isLocal 标志即可。

对于本地资源,您必须使用 AudioCache 类(见下文)。

要播放远程文件,只需调用 play 并传入 url(isLocal 参数默认为 false)

  play() async {
    int result = await audioPlayer.play(url);
    if (result == 1) {
      // success
    }
  }

对于本地文件,请添加 isLocal 参数

  playLocal() async {
    int result = await audioPlayer.play(localPath, isLocal: true);
  }

isLocal 标志是必需的,因为 iOS 对此有区别(Android 无论如何都不关心)。

还有一个可选的命名 double volume 参数,默认为 1.0。它可以从 0.0(静音)到 1.0(最大)变化,线性变化。

也可以随时使用 setVolume 方法更改音量。

控制

播放后,您可以使用 pause、stop 和 seek 命令来控制音频。

Pause 会暂停音频,但将光标保留在原处。随后调用 play 将从该点继续播放。

  int result = await audioPlayer.pause();

Stop 会停止音频并重置光标。随后调用 play 将从头开始播放。

  int result = await audioPlayer.stop();

最后,使用 seek 来跳转音频

  int result = await audioPlayer.seek(new Duration(milliseconds: 1200));

此外,您还可以恢复(类似于 play,但无需新参数)

  int result = await audioPlayer.resume();

更精细的控制

默认情况下,播放器将在播放完成或调用 stop 方法后释放。

这是因为在 Android 上,MediaPlayer 实例可能会占用大量资源,如果您播放很多不同的音频,保持未释放的状态会导致性能问题。

这不适用于 iOS,所以 release 什么也不做。

您可以更改 Release Mode 来确定 MediaPlayer 在完成/停止后的实际行为。有三种选项

  • RELEASE:默认模式,停止/完成后释放。
  • STOP:永远不会释放;调用 play 应该更快。
  • LOOP:永远不会释放;完成后,它将循环播放。

如果您的模式不是 RELEASE,您应该自己调用 release 方法;例如

  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

  // on button click
  await audioPlayer.resume(); // quickly plays the sound, will not release

  // on exiting screen
  await audioPlayer.release(); // manually release when no longer needed

尽管 Android MediaPlayer 有复杂的状体图,但 AudioPlayer 实例的状态永远不应该是无效的。即使它被释放了,如果调用 resume,数据也会被重新获取。

处理器

您可以为多个事件处理程序注册回调,如下所示

时长处理程序

此处理程序在文件时长可用时返回文件的时长(这可能需要一段时间,因为它正在下载或缓冲)。

  player.durationHandler = (Duration d) {
    print('Max duration: $d');
    setState(() => duration = d);
  };

位置处理程序

此处理程序会更新音频的当前位置。例如,您可以使用它来制作一个进度条。

  player.positionHandler = (Duration  p) => {
    print('Current position: $d');
    setState(() => duration = d);
  };

完成处理程序

音频播放完成时会调用此处理程序;例如,在 loop 方法中使用。

当您通过 pause 或 stop 中断音频时,它不会触发。

  player.completionHandler = () {
    onComplete();
    setState(() {
      position = duration;
    });
  };

错误处理程序

当原生代码中抛出意外错误时会调用此项。

  player.errorHandler = (msg) {
    print('audioPlayer error : $msg');
    setState(() {
      playerState = PlayerState.stopped;
      duration = new Duration(seconds: 0);
      position = new Duration(seconds: 0);
    });
  };

AudioCache

为了播放本地资源,您必须使用 AudioCache 类。

Flutter 没有提供一种简单的方式来播放您的资源中的音频,但此类帮助很大。它实际上会将资源复制到设备上的临时文件夹中,然后将其作为本地文件播放。

它用作缓存,因为它会跟踪已复制的文件,以便您可以无延迟地重放它们。

您可以在 此处 找到此类完整文档。

支持的格式

您可以在下方查看支持的格式列表

:warning: iOS 应用传输安全

默认情况下,iOS 禁止从非 https url 加载。要取消此限制,您必须编辑您的 .plist 并添加

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

GitHub

https://github.com/luanpotter/audioplayers