保持 Flutter 的 just_audio 和 audio_service 同步以进行随机播放
Keeping Flutter's just_audio and audio_service in sync for shuffle mode
我正在使用 Flutter 中的 Just Audio 实现音频服务的基本版本。我已经弄清楚了大部分功能,但我不知道如何在随机播放和取消播放时使 MediaItem 队列与音频播放器的播放列表保持同步。
这是我目前尝试过的方法:
@override
Future<void> setShuffleMode(AudioServiceShuffleMode shuffleMode) async {
final oldIndices = _player.effectiveIndices!;
switch (shuffleMode) {
case AudioServiceShuffleMode.none:
final list = List.generate(
oldIndices.length, (index) => queue.value![oldIndices[index]]);
queue.add(list);
_player.setShuffleModeEnabled(false);
break;
case AudioServiceShuffleMode.group:
case AudioServiceShuffleMode.all:
_player.setShuffleModeEnabled(true);
_player.shuffle();
final playlist =
oldIndices.map((index) => queue.value![index]).toList();
queue.add(playlist);
break;
}
}
这会在洗牌后更新队列,但不允许它返回。我敢肯定一定有一个简单的解决方案,但我的大脑无法理解。 official example 没有演示洗牌。
我建议将每个 audio_service MediaItem
存储在每个 just_audio IndexedAudioSource
的 tag
属性 中。然后就可以方便的将just_audio的有效序列映射到队列中:
_player.sequenceStateStream
.map((state) => state?.effectiveSequence)
.distinct()
.map((sequence) =>
sequence?.map((source) => source.tag as MediaItem).toList())
.pipe(queue);
我正在使用 Flutter 中的 Just Audio 实现音频服务的基本版本。我已经弄清楚了大部分功能,但我不知道如何在随机播放和取消播放时使 MediaItem 队列与音频播放器的播放列表保持同步。
这是我目前尝试过的方法:
@override
Future<void> setShuffleMode(AudioServiceShuffleMode shuffleMode) async {
final oldIndices = _player.effectiveIndices!;
switch (shuffleMode) {
case AudioServiceShuffleMode.none:
final list = List.generate(
oldIndices.length, (index) => queue.value![oldIndices[index]]);
queue.add(list);
_player.setShuffleModeEnabled(false);
break;
case AudioServiceShuffleMode.group:
case AudioServiceShuffleMode.all:
_player.setShuffleModeEnabled(true);
_player.shuffle();
final playlist =
oldIndices.map((index) => queue.value![index]).toList();
queue.add(playlist);
break;
}
}
这会在洗牌后更新队列,但不允许它返回。我敢肯定一定有一个简单的解决方案,但我的大脑无法理解。 official example 没有演示洗牌。
我建议将每个 audio_service MediaItem
存储在每个 just_audio IndexedAudioSource
的 tag
属性 中。然后就可以方便的将just_audio的有效序列映射到队列中:
_player.sequenceStateStream
.map((state) => state?.effectiveSequence)
.distinct()
.map((sequence) =>
sequence?.map((source) => source.tag as MediaItem).toList())
.pipe(queue);