问题描述
长时间不操作应用后,点击"下一曲"会提示播放错误并自动跳转到下一首,但点击"上一曲"却能正常播放。
问题分析
根本原因:预加载 URL 过期机制缺失
播放器有预加载下一首歌曲 URL 的功能(nextPrefetch),但当前实现存在以下问题:
| 步骤 |
场景 |
结果 |
| 1 |
播放歌曲 A 成功 |
预加载歌曲 B 的 URL,存储在 nextPrefetch |
| 2 |
长时间不操作(如 20 分钟) |
网易云音乐 URL 过期失效 |
| 3 |
点击"下一曲" |
getAudioSource() 发现 ID 匹配,直接使用过期 URL |
| 4 |
播放失败 |
错误处理清除缓存,重试或跳转 |
为什么"上一曲"能正常播放?
点击"上一曲"时,歌曲 ID 与预加载缓存不匹配,因此会重新获取新鲜的 URL,而不是使用过期的缓存。
API 返回数据
网易云 /song/url/v1 API 返回的 expi 字段表示 URL 有效时间(通常为 1200 秒 = 20 分钟):
{
"data": [{
"id": 1901371647,
"url": "http://m702.music.126.net/...",
"expi": 1200, // URL 有效时间(秒)
...
}]
}
代码位置
| 文件 |
行号 |
问题 |
SongManager.ts |
52 |
nextPrefetch 类型无时间戳字段 |
SongManager.ts |
350-470 |
prefetchNextSong 不保存获取时间或过期时间 |
SongManager.ts |
515-523 |
使用缓存时无过期检查 |
PlayerController.ts |
973-1010 |
nextOrPrev 切歌时不清除缓存 |
相关文件
src/core/player/SongManager.ts
src/core/player/PlayerController.ts
感谢您的开源项目!
问题描述
长时间不操作应用后,点击"下一曲"会提示播放错误并自动跳转到下一首,但点击"上一曲"却能正常播放。
问题分析
根本原因:预加载 URL 过期机制缺失
播放器有预加载下一首歌曲 URL 的功能(
nextPrefetch),但当前实现存在以下问题:nextPrefetchgetAudioSource()发现 ID 匹配,直接使用过期 URL为什么"上一曲"能正常播放?
点击"上一曲"时,歌曲 ID 与预加载缓存不匹配,因此会重新获取新鲜的 URL,而不是使用过期的缓存。
API 返回数据
网易云
/song/url/v1API 返回的expi字段表示 URL 有效时间(通常为 1200 秒 = 20 分钟):{ "data": [{ "id": 1901371647, "url": "http://m702.music.126.net/...", "expi": 1200, // URL 有效时间(秒) ... }] }代码位置
SongManager.tsnextPrefetch类型无时间戳字段SongManager.tsprefetchNextSong不保存获取时间或过期时间SongManager.tsPlayerController.tsnextOrPrev切歌时不清除缓存相关文件
src/core/player/SongManager.tssrc/core/player/PlayerController.ts感谢您的开源项目!