Skip to content

修复后台播放因Audio无法处理降级策略的问题,增加预载窗口#43

Merged
Re-BeiChen merged 2 commits into
SPlayer-Dev:devfrom
Shomi-FJS:cache-fix
Jun 15, 2026
Merged

修复后台播放因Audio无法处理降级策略的问题,增加预载窗口#43
Re-BeiChen merged 2 commits into
SPlayer-Dev:devfrom
Shomi-FJS:cache-fix

Conversation

@Shomi-FJS

Copy link
Copy Markdown

📌 变更类型

  • ✨ feat — 新功能
  • 🐞 fix — Bug 修复
  • 🎨 style — 仅样式 / 格式,不影响逻辑
  • ♻️ refactor — 重构,不改变外部行为
  • ⚡ perf — 性能优化
  • 📝 docs — 仅文档
  • 🧪 test — 新增 / 修改测试
  • 🔧 chore — 构建 / 脚本 / 依赖
  • 🚀 ci — 仅 CI 配置
  • ⏪ revert — 回滚

📝 变更说明

本 PR 主要修复 Android 原生播放在后台 / 锁屏场景下的在线歌曲 URL 解析、预载和自动切歌稳定性问题,并优化高音质播放的缓存预热策略。

核心改动:

  • 修复 Android 原生播放 URL 解析逻辑,完善高音质降级链路,降低在接口 400/502 或不可用时导致下一首无法预载、无法播放的概率。
  • 优化 disableAiAudio 与 Android 原生播放上下文同步逻辑,确保音质开关变化后 Java 端能拿到一致的音质过滤与降级策略。
  • 修复 Android 原生队列窗口与 API 上下文同步竞态,保证原生端预载下一首前已获得 apiBaseUrl / cookie / songLevel,避免 updateQueueContext 先到达导致 URL 解析跳过。
  • 优化锁屏 / 后台播放的下一首预载触发时机,在队列窗口接近耗尽时提前请求补窗,减少歌曲播放结束后才依赖 WebView 续窗导致的卡住风险。
  • 将 Android 音频短预载从 512KB 提升到 2MB,降低音频在开头数秒跨过缓存边界后发生阻塞的概率。
  • 优化预载缓存 TTL 清理逻辑,避免 sweep 主动初始化 SimpleCache 抢占启动期 IO,并防止删除失败后索引丢失造成孤儿缓存。
  • 修复切换失败后的状态回滚,避免前端显示的与实际播放不一致。
  • 在移动端播放器音质入口中补充真实音质展示、可用音质列表刷新、重复点击保护和空状态反馈,提升音质快捷切换体验。
  • 优化播放错误重试逻辑,修复重复上限判断导致的重试次数 off-by-one 问题。

🔗 关联 Issue

Closes #

📱 影响范围

  • 🎵 播放引擎 / 音频
  • 📝 歌词 / 桌面歌词
  • 🔔 通知栏 / MediaSession
  • 🌐 在线音乐 (网易云 / Jellyfin / Navidrome / Emby / Subsonic / Last.fm)
  • 🧩 内置 API (nodejs-mobile)
  • 🎨 UI / 主题 / 布局
  • 📦 构建 / 打包 / 签名
  • 📱 Capacitor / 原生 Android 代码
  • 📄 文档 / README

✅ 自检清单

  • 本 PR 目标分支为 dev
  • 本地已执行 pnpm lint 且无 warning
  • 本地已执行 pnpm typecheck 且无报错
  • 已在 至少一台真机 上构建并验证关键路径
  • UI 改动已兼顾 手机竖屏 + 平板横屏 两种布局
  • 新增 / 修改的文案使用中文,与项目整体风格一致
  • 未引入不必要的依赖 / 大体积资源
  • 未修改签名密钥 / CI Secrets 相关文件

详细修改内容:
- 新增disableAiAudio配置项,用于屏蔽AI增强音质
- 重构音质获取逻辑,支持自动降级可用音质
- 优化Android端播放上下文同步流程
- 移动端播放器新增音质快速选择弹窗
- 修复音质切换失败后的回滚逻辑
- 调整预加载策略,优化切歌体验
- 优化播放错误处理逻辑
- 新增无权限歌曲过滤机制,无权限时自动跳过曲目
- 新增 Android 端音频 URL 本地缓存,切歌时优先命中已缓存资源
- 新增 isPromotedAudioReady 接口,检测预载音频是否已完整缓存
- 优化 syncApiContext 调用顺序,确保上下文同步后再并发请求
- 优化 AudioPrefetchTtlIndex 清理逻辑,避免未过期条目被误删
- 优化 sweep 使用 peekSimpleCache 替代 getOrCreate,避免不必要的缓存初始化
- 优化 getPromotedAudioFile 使用 getOrCreate 保证缓存实例可用
- 播放无权限歌曲时给出明确提示并自动跳至下一首
- syncApiContext 去重键新增 playSongDemo 维度
@Re-BeiChen Re-BeiChen merged commit 9f097a7 into SPlayer-Dev:dev Jun 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants