9e58d5267850ac5842c0efcbb195d42cb2f463e6
问题(后台播一段时间后无法缓冲,点下一首也没反应,只能重启):
1. _isChangingTrack 是没有超时的锁:_playCurrent() 置 true 后,
只有走完 finally 才会清。mpv 的 open() 在弱网下可能挂很久,
锁就一直不释放,之后 next()/previous() 全被静默拒绝。
2. 元数据用 dio.download 整文件下载,和 mpv 流式播放抢带宽,
20Mbps FRP 下播放流只剩一两百 K/s,缓冲长期为 0。
3. 没有订阅 mpv 的 error/buffering,失败无感知、无法自愈。
改动:
- playback_service: open 20s / 控制命令 5s 超时;失败时 stop 回空闲并上抛异常
- audio_service:
* 去掉「正在切歌就拒绝」的逻辑,改为 latest-wins(epoch 校验,
旧请求自行放弃,只有最新请求解锁)
* 播放失败不再吞掉:记录 lastPlaybackError 并 notifyListeners
* 订阅 stream.error / stream.buffering
* 缓冲超过 30s 自动重连当前歌曲并 seek 回原位置(2 分钟内最多一次)
- file_provider: 元数据改为 Range 只取头部 2MB,流式写入并在切歌时取消上一请求
- home_page: 去掉重复的 PlaybackService().play()(同一首歌会被 open 两次),
登录校验提前
验证:dart analyze 无 error;gradlew assembleDebug BUILD SUCCESSFUL。
真机验证待设备重新连接后进行。
清听 QingTing
让远程音乐,像本地音乐一样可靠。
清听是一个面向 Android 的 WebDAV 音乐播放器。
它解决的事情很简单:
让存储在 WebDAV 服务器上的音频文件,获得稳定、连续、可控的本地级播放体验。
✨ 能力
- WebDAV 流式播放,无需下载
- 后台播放,退出应用不停
- 通知中心、锁屏、耳机控制
- 元数据读取与 SQLite 缓存
- 通知栏封面图
🚀 快速开始
# 克隆
git clone https://your-repo/qingting.git
cd qingting
# 获取依赖
flutter pub get
# 运行
flutter run
详细步骤:Getting Started →
📖 文档
- 整体架构 —— 系统怎么组织的
- 播放链路 —— 一首歌从点击到喇叭
- 元数据 —— 歌曲信息怎么被认识
- Android 集成 —— 怎么成为 Android 播放器
- 存储策略 —— 远程与本地如何共存
- 设计决策 —— 为什么选了这些方案
最好的播放器,是当你开始听歌之后,就再也感觉不到它技术细节的那一个。
Languages
Dart
96.7%
PowerShell
2.1%
Kotlin
1.2%