我尝试阅读 Github 上的项目自述文件和问题,看看是否可以使用 Flutter 的
just_audio
和 audio_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
请注意,每个玩家都会消耗原生资源,这意味着两件事:
dispose
,因为这将释放这些资源以供其他应用程序使用。在audio_service方面,您基本上是在用户按下播放按钮等时实现您想要发生的回调,并且您可以将上述代码粘贴到回调中。例如,如果您想在用户单击“播放”时同时播放两个玩家,您可以像这样实现回调:
Future<void> play() async {
player1.play();
player2.play();
}
您也可以类似地实现暂停回调:
Future<void> pause() async {
player1.pause();
player2.pause();
}
对我来说,这一切都很顺利。这使得同步延迟几乎小于 10 秒。
void playInSync() async {
// Ensure both players are ready to play
await player1.setLoopMode(LoopMode.one);
await player2.setLoopMode(LoopMode.one);
// Start both players at the same time
await player1.play();
player2.play();
// Adjust the second player to sync perfectly if needed
player1.positionStream.listen((position) {
//After 1 sec, synchronize
if ((player1.position - player2.position).inMilliseconds.abs() > 1 && player1.position.inMilliseconds==1.0)) {
player2.seek(player1.position);
}
});
}