【发布时间】:2021-03-11 10:27:18
【问题描述】:
我正在使用flutter audio_service (https://pub.dev/packages/audio_service) 和just_audio (https://pub.dev/packages/just_audio) 在前台和后台播放音频文件。
我继承了 BackgroundAudioTask,添加了一个 AudioPlayer 实例,并覆盖了所需的方法。例如我更新了重复模式:
@override
Future<void> onSetRepeatMode(AudioServiceRepeatMode repeatMode) async {
super.onSetRepeatMode(repeatMode);
switch (repeatMode)
{
case AudioServiceRepeatMode.all:
_audioPlayer.setLoopMode(LoopMode.all);
break;
case AudioServiceRepeatMode.none:
_audioPlayer.setLoopMode(LoopMode.off);
break;
case AudioServiceRepeatMode.one:
_audioPlayer.setLoopMode(LoopMode.one);
break;
case AudioServiceRepeatMode.group:
_audioPlayer.setLoopMode(LoopMode.all);
break;
}
}
@override
Future<void> onPlayFromMediaId(String mediaId) async {
await _audioPlayer.stop();
// Get queue index by mediaId.
_queueIndex = _queue.indexWhere((test) => test.id == mediaId);
// Set url source to _audioPlayer.
downloadAndPlay(_mediaItem);
}
我正在尝试添加播放列表并循环播放音频文件,但似乎缺少某些内容,并且在播放曲目 #1 后,播放器试图从相同的 #1 曲目开始并再次播放。 这是我的代码(downloadAndPlay 的一部分):
var list=List<AudioSource>();
for (int t=0;t<_queue.length;t++)
{
var mi=_queue[t];
var url = mi.extras['source'];
list.add(AudioSource.uri(Uri.parse(url)));
}
D("Loading list with ${list.length} items");
D("Seeking to index : $_queueIndex");
await _audioPlayer.load(ConcatenatingAudioSource(children: list),
initialIndex: _queueIndex, initialPosition: Duration.zero);
AudioService.updateQueue(_queue);
AudioService.setRepeatMode(AudioServiceRepeatMode.all);
_audioPlayer.play();
我添加了这个来检查 ProcessingState.completed 是否被触发,这意味着它到达了轨道的结尾,但它没有触发:
playerEventSubscription = _audioPlayer.playbackEventStream.listen((event) {
D("audioPlayerTask: playbackEventStream : ${event.processingState}");
switch (event.processingState) {
case ProcessingState.ready:
_setState(state: AudioProcessingState.ready);
break;
case ProcessingState.buffering:
_setState(state: AudioProcessingState.buffering);
break;
case ProcessingState.completed:
_handlePlaybackCompleted();
break;
default:
break;
}
});
【问题讨论】:
-
您应该等待“加载”完成后再搜索(使用等待),或者最好将初始搜索索引和位置传递给“加载”方法(有关详细信息,请参阅文档)。所有这些方法都是异步的,因此如果您希望它们按顺序完成,您应该等待它们的完成。唯一的例外是“播放”,它需要很长时间才能完成,您可能不需要等待它完成。如果您正在编写正确的代码但循环仍然无法正常工作,则这是一个错误,您应该报告它。
-
我添加了等待,并更新了上面的代码。但是它在播放完当前曲目后仍然不会进入下一曲目。 @RyanHeise
标签: flutter audio queue just-audio