首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >支持队列和多播放列表的应用程序的audio_service和just_audio设计

支持队列和多播放列表的应用程序的audio_service和just_audio设计
EN

Stack Overflow用户
提问于 2021-06-19 22:38:48
回答 1查看 596关注 0票数 0

我正在为柯尔构建一个移动应用程序,使用Flutter和audio_service+just_audio组合。这个应用程序基本上是这样工作的:

  1. 用户登录
  2. 应用程序从服务器加载大量JSON数据
  3. App分析将数据分成歌曲、艺术家、专辑和播放列表。
  4. App允许用户将歌曲添加到(顶部/底部/当前之后)/从队列中删除歌曲并播放或洗牌。整个应用程序中只有一个队列(即如果用户在播放列表屏幕中按下"Play All“,队列的当前内容将被该播放列表中的歌曲替换)。
  5. 我在这里假设一个队列(List<Song>?)而且应该始终存在一个ConcatenatingAudioSource (尽管可以是空的),这样就可以执行第4步了。

我一直试图用audio_servicejust_audio (ConcatenatingAudioSource)实现步骤4,但到目前为止还没有成功。从本质上说,我不清楚如何设计应用程序的架构。我是否需要对Song队列进行测试,并将其与audio_servicejust_audio同步,如果需要,如何实现?当用户从UI中删除歌曲小部件时,如何从队列中删除相应的Song,从ConcatenatingAudioSource中删除相应的MediaItem?用户在播放列表屏幕中的歌曲小部件上点击“现在播放”什么,在保持队列活动的同时,引擎盖下面应该发生什么才能使播放器切换到该歌曲?

(值得一提的是,audio_service给出的示例非常基本,在固定队列中有固定的歌曲列表,这与我的情况不太相似。另外,某些特性(例如,将歌曲排在当前的歌曲后面)似乎不可用,这意味着我必须依赖BackgroundAudioTask.onCustomAction,它只接受某些数据类型作为参数。MediaItem和我的定制Song模型对象似乎不受支持。)

EN

回答 1

Stack Overflow用户

发布于 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队列中:

代码语言:javascript
运行
复制
_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中广播一个新队列。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68051268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档