flutter - 支持排队和多个播放列表的应用程序的 audio_service 和 just_audio 设计
问题描述
我正在使用 Flutter 和+组合为Koel构建一个移动应用程序。该应用程序基本上是这样工作的:audio_service
just_audio
- 用户登录
- 应用从服务器加载大量 JSON 数据
- 应用程序将所述数据解析为歌曲、艺术家、专辑和播放列表
- 应用程序允许用户将歌曲添加到(顶部/底部/当前之后)/从队列中删除歌曲并播放或随机播放它们。整个应用程序中只有一个队列(即,如果用户在播放列表屏幕中按“全部播放”,队列的当前内容将被该播放列表中的歌曲替换)。
- 我在这里假设一个队列(
List<Song>
?)和一个ConcatenatingAudioSource
应该总是在那里(尽管可以是空的),以便可以进行第 4 步
audio_service
我一直在尝试使用and just_audio
( )来实现第 4 步ConcatenatingAudioSource
,但到目前为止还没有那么成功。本质上,我不清楚如何设计应用程序的架构。我是否需要检测队列并将其与andSong
同步,如果是,如何?当用户从 UI 中删除歌曲小部件时,如何从队列和? 用户在播放列表屏幕中的歌曲小部件上点击“立即播放”的内容,在使播放器切换到该歌曲同时仍保持队列处于活动状态的情况下应该发生什么?audio_service
just_audio
Song
MediaItem
ConcatenatingAudioSource
(可能值得一提的是,给出的示例audio_service
非常基本,固定队列中有固定的歌曲列表,这与我的情况几乎不相似。此外,某些功能(例如,将歌曲排在当前歌曲之后) t 似乎可用,这意味着我必须依赖BackgroundAudioTask.onCustomAction
,它只接受某些数据类型作为参数。MediaItem
而且我的自定义Song
模型对象似乎不受支持。)
解决方案
我同意您保留单个ConcatenatingAudioSource
并仅使用其方法插入、删除或替换其子项的方法。然后,您可以收听以sequenceStateStream
观察 just_audio 播放列表的更改并将它们传送到 audio_service。
这个答案展示了如何使用即将发布的 0.18 版本的 audio_service 的预览来保持 just_audio 和 audio_service 播放列表同步。首先,将MediaItem
audio_service 对象存储在tag
just_audio 播放列表中每个项目的属性中,然后将 just_audio 的序列从映射和管道传输sequenceStateStream
到 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
。
推荐阅读
- python - 从 API 链接 Python 提取 XML 数据
- firebase - Firestore 规则不适用于集合
- c++ - Forward custom allocator in std::vector to a class element
- java - 将输入与列表进行比较
, 告诉用户输入是否正确、几乎正确或错误 - java - oracle.jdbc.driver.T4CConnection.getSchema() 异常
- angular - 为什么 tree-shake 会从服务中删除未使用的公共方法
- android - 将回调函数传递给Android中的自定义视图
- batch-file - 我有多个包含阿拉伯语值的 .sql 文件,当我在 .bat 文件中使用 sqlcmd 运行它们时,数据库中无法识别阿拉伯语
- tensorflow - ValueError: Expect x to be an non-empty array or dataset (Tensor Flow lite model maker on Collab)
- javascript - json元素可以有不同的属性吗?