如何用just_audio和audio_service同时播放两个(或更多)音频文件?

How to play two (or more) audio files simultaneously with just_audio and audio_service?

我尝试阅读 Github 上的项目自述文件和问题,看看是否可以使用 just_audioaudio_service 插件同时播放两个或更多音频文件扑。有没有人使用这些插件或类似插件实现了类似的东西?我目前在生产中使用这些插件,因此最好坚持使用它们以向应用程序添加所需的功能。

任何帮助将不胜感激,谢谢!

在just_audio中,您可以创建两个AudioPlayer实例并设置它们播放不同的音频源。例如

final player1 = AudioPlayer();
final player2 = AudioPlayer();

await player1.setUrl(url1);
await player2.setUrl(url2);
...
player1.play(); // don't await
player2.play(); // don't await

如果您等待每个播放请求,则在等待第一个播放完成后才会开始播放第二个。所以通过 not 等待,第二个播放请求应该在第一个播放请求之后的毫秒内被触发,并且两者将并行播放。

如果出于任何原因你需要等到两个玩家都完成游戏,你可以使用 Future.wait:

await Future.wait([
  player1.play(),
  player2.play(),
]);
print('done'); // this will print after both players are finished.

(基于您的评论的额外示例)循环 player2 直到 player1 完成:

await player2.setLoopMode(LoopMode.one);
player2.play(); // don't await
await player1.play(); // wait for player1 to complete
await player1.pause(); // or stop or dispose
await player2.pause(); // or stop or dispose

请注意,每个玩家都会用完本机资源,这意味着两件事:

  1. 如果您创建过多的并行实例,您可能会达到资源限制。
  2. 您应该在每个播放器使用完毕后调用 dispose,因为这会释放这些资源以供其他应用使用。

在 audio_service 方面,您基本上是在为您希望在用户按下播放按钮等时发生的事情实现回调,并且您可以将上述代码粘贴到回调中。例如,如果你想在用户点击“播放”时同时播放两个玩家,你可以这样实现你的回调:

Future<void> play() async {
  player1.play();
  player2.play();
}

您也可以类似地实现暂停回调:

Future<void> pause() async {
  player1.pause();
  player2.pause();
}