flutter just_audio和audio_service问题记录


最近在学用flutter写音乐app,音乐播放方面主要用到了两个库:just_audioaudio_service,其中

just_audio负责音乐的播放功能,audio_service负责音乐的后台、通知栏展示功能。


先说一下为啥选两个,在此之前我也用过其他的,但都存在一些或多或少的问题:

audio_players:指定播放链接不能使用headers参数,这就意味着需要带headers才能调用的播放链接都不能用(比如某易云),需要下载到本地再进行指定,这样太麻烦了;

assets_audio_player: 自带后台播放功能,可以用,但是可能是我没正确使用的原因,遇到一些小bug;

audio_background:后台播放模块,但不支持歌单的整体播放,作者也是建议如果是歌单的话就用audio_service
:::

调用逻辑

在这里插入图片描述

  1. 共分为4个层
  • UI层,即界面
  • logic层,使用GetxController定义的控制器,参数定义在GetxService以保持页面间的持久化
  • handler层,基于BaseAudioHandler的处理类,负责和player的交互
  • player层,定义的AudioPlayer,具体的音乐播放、切换等是在这里调用的
  1. 处理流
  • handler层 去监听 player层 的数据变化。
    在这里插入图片描述
    上述代码为例,player层通过playbackEventStream流进行广播,我们在handler层进行监听,然后再由handler层转发广播出去。

  • handler层通过playbackState进行广播,我们在logic层进行监听,并记录下来,供UI层展示
    在这里插入图片描述

  • 当 UI层进行播放、切歌等功能时,调用logic层的方法,去调用handler层的方法,再由handler层去调用player层的方法。

参考教程

pub.dev中搜索audio_service
在这里插入图片描述
跟着第一篇文章中的教程做一遍,就会得七七八八了。

我也是在这篇文章的基础上进行开发的,并在其中发现了一些问题,记录下来。

问题

  1. 问题:文章中只提供了往歌单中添加歌曲的方法,没提供播放新歌单的方法;
    解决办法:在往player层添加歌曲之前,先通过await _playlist.clear();将歌单清空。
  2. 问题:在进行随机播放时,歌单索引会进行乱序,并同步更新到UI层,如果你还有一个正常顺序的歌单要同时控制播放,那要注意了;
    解决办法:正常顺序的歌单通过index = _player.shuffleIndices!.indexOf(index);获取到随机歌单中正确的索引。
  3. 异步方法执行都没用await,会有执行混乱的情况发生;
    解决办法:异步方法都加上await执行。
  4. handler层把歌曲时长和当前歌曲的监听都使用MediaItem进行传递了,需要区分,不然如果需要更新时长的地方,你更新当前歌曲了,而两首歌又不是同一首的话,那就糟糕了;
    解决办法:在MediaItem.extras中添加字段,更新时长时设MediaItem.extras?['update_duration'] = true;,更新当前歌曲时设extras?['update_index'] = true;进行区分。
  5. 把逻辑在统一一下,除了播放顺序和随机播放,其他需要同步到UI层的数据,均由player层进行传递。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值