【问题标题】:Silence between tracks in just_audiojust_audio 中曲目之间的静音
【发布时间】:2021-06-05 09:09:10
【问题描述】:

我想在使用 just_audio AudioPlayer 实例创建的播放列表中的曲目之间有一个可变长度的暂停(我想在此间隔期间播放一个背景曲目)。大意是:

_voiceAudioPlayer.currentIndexStream.listen((event) {
  _voiceAudioPlayer.pause();
  Future.delayed(const Duration(seconds: 4), () => _voiceAudioPlayer.play());
});

这会引发错误:

“未处理的异常:错误状态:无法触发新事件。控制器已经在触发事件”

有没有一种干净的方法可以做到这一点?我正在考虑在播放列表中的所有其他曲目中添加静音 mp3,但我觉得应该有更好的方法。

【问题讨论】:

    标签: flutter just-audio


    【解决方案1】:

    发生此错误是因为currentIndexStream 是“同步”广播流,因此在处理当前事件时(即在事件循环的同一循环中),您无法触发另一个状态更改事件。但是你可以通过在当前周期之后安排一个微任务来解决这个问题:

    _voiceAudioPlayer.currentIndexStream.listen((index) {
      scheduleMicrotask(() async {
        _voiceAudioPlayer.pause();
        await Future.delayed(Duration(seconds: 4));
        _voiceAudioPlayer.play();
      });
    });
    

    不过,由于 just_audio 播放列表的无间隙特性,我不会指望此回调会很快执行。也就是说,下一个音轨将立即开始播放,因此在暂停发生之前,您肯定会听到至少一小部分下一个项目的音频。

    有一个打开的 feature request SilenceAudioSource 可以插入到播放列表中(如果您希望实现它,可以通过单击竖起大拇指按钮来投票支持该问题。)无声音频文件您提出的实际上是SilenceAudioSource 的最简单替代方案。

    否则,另一种方法是根本不使用无缝播放列表功能(因为您反正不需要无缝功能),只需实现自己的逻辑来推进队列:

    final queue = [source1, source2, source3, ...];
    for (var source in queue) {
      await _voiceAudioPlayer.setAudioSource(source);
      await _voiceAudioPlayer.play();
      await Future.delayed(seconds: 4);
    }
    

    上面的示例不处理暂停/恢复逻辑,但它只是为了表明如果您不需要无缝功能,您可以将播放列表逻辑掌握在自己手中。

    【讨论】:

      猜你喜欢
      • 2023-04-08
      • 2017-01-12
      • 2021-09-19
      • 2020-07-21
      • 2021-04-20
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      相关资源
      最近更新 更多