【问题标题】:How to play two (or more) audio files simultaneously with just_audio and audio_service?如何使用 just_audio 和 audio_service 同时播放两个(或更多)音频文件?
【发布时间】:2023-04-10 13:29:01
【问题描述】:

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

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

【问题讨论】:

    标签: flutter dart just-audio


    【解决方案1】:

    在 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
    

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

    如果出于任何原因您需要等到两个玩家都玩完后,您可以使用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();
    }
    

    【讨论】:

    • 我不确定这是否超出了我原来问题的范围以及是否需要提出一个新问题,但是有没有办法重复循环 player2 直到 @987654332 @播放完毕了吗?
    • @RyanHeise,你能告诉我并行实例的限制是多少吗?大多数设备一次播放 5 个声音还是 50 个并行声音?
    • 您必须通过自己的测试来发现这一点,但实际上可能会因特定设备的资源而异。我不确定这些数字是多少。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2021-10-06
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    相关资源
    最近更新 更多