我正在为柯尔构建一个移动应用程序,使用Flutter和audio_service
+just_audio
组合。这个应用程序基本上是这样工作的:
List<Song>
?)而且应该始终存在一个ConcatenatingAudioSource
(尽管可以是空的),这样就可以执行第4步了。我一直试图用audio_service
和just_audio
(ConcatenatingAudioSource
)实现步骤4,但到目前为止还没有成功。从本质上说,我不清楚如何设计应用程序的架构。我是否需要对Song
队列进行测试,并将其与audio_service
和just_audio
同步,如果需要,如何实现?当用户从UI中删除歌曲小部件时,如何从队列中删除相应的Song
,从ConcatenatingAudioSource
中删除相应的MediaItem
?用户在播放列表屏幕中的歌曲小部件上点击“现在播放”什么,在保持队列活动的同时,引擎盖下面应该发生什么才能使播放器切换到该歌曲?
(值得一提的是,audio_service
给出的示例非常基本,在固定队列中有固定的歌曲列表,这与我的情况不太相似。另外,某些特性(例如,将歌曲排在当前的歌曲后面)似乎不可用,这意味着我必须依赖BackgroundAudioTask.onCustomAction
,它只接受某些数据类型作为参数。MediaItem
和我的定制Song
模型对象似乎不受支持。)
发布于 2021-06-20 04:05:25
我同意您的方法,即保留一个ConcatenatingAudioSource
,只使用它的方法插入、删除或替换它的子元素。然后,您可以收听sequenceStateStream
,观察对just_audio的播放列表的更改,并将其导入audio_service。
这个答案展示了如何使用即将发布的0.18版本的just_audio和audio_service播放列表保持同步。首先,将MediaItem
audio_service对象存储在just_audio播放列表中每个项的tag
属性中,然后将sequenceStateStream
中的map _ audio_service序列映射到audio_service队列中:
_player.sequenceStateStream
.map((state) => state?.effectiveSequence)
.distinct()
.map((sequence) =>
sequence?.map((source) => source.tag as MediaItem).toList())
.pipe(queue); // <-- this is the audio_service queue stream
如果您使用的是audio_service 0.17或更早版本,则just_audio端的原则仍然相同,只是在audio_service端有一个setQueue
方法,而不是queue
流,所以您不能简单地输送流。相反,您将删除最后的.pipe(queue)
位并执行.listen(AudioServiceBackground.setQueue)
。
其效果是,每次just_audio
中的有效播放列表(即播放列表)发生变化时,它将在audio_service
中广播一个新队列。
https://stackoverflow.com/questions/68051268
复制相似问题