-
Notifications
You must be signed in to change notification settings - Fork 1k
Description
检查清单
- 我已检索仓库中所有的 Issues,确保我没有重复提交问题;或有相似 Issue,但我觉得我的情况不包含在那个相似 Issue 之内
- 我已经找到了可以复现这个问题的方法,并且写在了下面的「具体信息」中
- 此问题可以在我的设备和当前环境中稳定复现
- 此问题可以在最新版本 (Latest Release) 中复现
- 此问题是在我更新到当前版本后才出现的
是网页端还是客户端
客户端
当前系统环境
win10
当前 Node.js 及 npm 版本
No response
当前版本
SPlayer-3.0.0-beta.7-x64-portable
具体信息
#现象简述
保持播放器界面前台时,在笔记本电脑或外接键盘上按下 Fn 键或通过 Fn + Fxx 组合键实现音量加音量减等功能时,播放器会切换为上一首歌曲,然后停止播放并打开/关闭桌面歌词,即播放器会错误地触发“上一首”、“停止播放”以及“开关桌面歌词”的操作。控制台显示播放请求被连续中断,推测为全局按键监听逻辑冲突导致的竞态问题。
#复现步骤
1.启动 SPlayer 并双击开始播放任意歌曲。
2.在播放器界面处于焦点或全局状态下,按下笔记本自带键盘的 Fn 键,或者按下 Fn + 音量加/减 功能键,亦或者使用外接键盘直接按下绑定的音量加减、上下一首功能键。
#实际结果
1.歌曲立即跳转至上一首。
2.播放状态变为停止。
3.桌面歌词状态被强制切换(开启或关闭)。
4.控制台弹出 AbortError: The play() request was interrupted by a call to pause()。
#预期结果
按下 Fn 键不应触发任何播放逻辑;按下音量键应仅调节系统或应用音量,不应干扰播放状态。
#原因推断
1.按键监听过宽: 渲染进程或主进程的 keydown 监听器可能未对 event.key 做严格过滤。某些笔记本键盘的 Fn 键或特殊功能键可能被错误映射到了 MediaTrackPrevious 或其他快捷键逻辑上。
2.异步操作冲突: nextOrPrev 被极短时间内连续触发,导致 audio.play() 尚未完成就被 audio.pause() 或新的 load() 中断,产生 AbortError。
#大致建议
1.在键盘事件处理函数中,增加对 event.key === 'Fn' 或 event.keyCode === 255 等特殊键位的过滤。
2.在 playSong 异步逻辑中,对 audio.play() 返回的 Promise 进行处理,捕获并忽略 AbortError,防止重试机制导致逻辑混乱。
3.增加播放锁(Play Lock)或防抖逻辑,避免在毫秒级时间内重复执行切换指令。
#调试日志
stores-Z3eQCmzt.js:2
❌ 音频播放失败: AbortError: The play() request was interrupted by a call to pause(). https://goo.gl/LdLk22
loadAndPlay@stores-Z3eQCmzt.js:2await in loadAndPlayplaySong@stores-Z3eQCmzt.js:2await in playSongnextOrPrev@stores-Z3eQCmzt.js:2(anonymous)@stores-Z3eQCmzt.js:2p@stores-Z3eQCmzt.js:2g@stores-Z3eQCmzt.js:2m@stores-Z3eQCmzt.js:2setTimeout(anonymous)@stores-Z3eQCmzt.js:2v@stores-Z3eQCmzt.js:2
stores-Z3eQCmzt.js:2
handlePlaybackError@stores-Z3eQCmzt.js:2playSong@stores-Z3eQCmzt.js:2await in playSongnextOrPrev@stores-Z3eQCmzt.js:2