[GH-ISSUE #689] (beta9可复现)按下笔记本 Fn 键或外接键盘绑定功能键,导致播放器异常触发歌曲切换逻辑 #328

Open
opened 2026-02-27 07:11:18 +03:00 by kerem · 5 comments
Owner

Originally created by @LYNXUTE on GitHub (Dec 30, 2025).
Original GitHub issue: https://github.com/imsyy/SPlayer/issues/689

检查清单

  • 我已检索仓库中所有的 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
⚠️ 播放出错 (Code: 20), 重试: 1/3
handlePlaybackError@stores-Z3eQCmzt.js:2playSong@stores-Z3eQCmzt.js:2await in playSongnextOrPrev@stores-Z3eQCmzt.js:2

Originally created by @LYNXUTE on GitHub (Dec 30, 2025). Original GitHub issue: https://github.com/imsyy/SPlayer/issues/689 ### 检查清单 - [x] 我已检索仓库中所有的 Issues,确保我**没有重复提交问题**;或有相似 Issue,但我觉得我的情况不包含在那个相似 Issue 之内 - [x] 我已经找到了可以复现这个问题的方法,并且写在了下面的「具体信息」中 - [x] 此问题可以在我的设备和当前环境中**稳定复现** - [x] 此问题可以在最新版本 (Latest Release) 中复现 - [x] 此问题是在我更新到当前版本后**才**出现的 ### 是网页端还是客户端 客户端 ### 当前系统环境 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 ⚠️ 播放出错 (Code: 20), 重试: 1/3 handlePlaybackError@stores-Z3eQCmzt.js:2playSong@stores-Z3eQCmzt.js:2await in playSongnextOrPrev@stores-Z3eQCmzt.js:2
Author
Owner

@github-actions[bot] commented on GitHub (Dec 30, 2025):

👋 您好 @LYNXUTE,感谢提交 Issue!
🚀 我们已经收到您的反馈,会尽快确认你的问题

在等待回复期间,您可以:

<!-- gh-comment-id:3700014458 --> @github-actions[bot] commented on GitHub (Dec 30, 2025): 👋 您好 @LYNXUTE,感谢提交 Issue! 🚀 我们已经收到您的反馈,会尽快确认你的问题 在等待回复期间,您可以: - 📖 查看 [项目文档](https://github.com/imsyy/SPlayer/blob/dev/README.md) - 💬 加入 [交流群](https://qm.qq.com/cgi-bin/qm/qr?k=2-cVSf1bE0AvAehCib00qFEFdUvPaJ_k&jump_from=webapi&authKey=1NEhib9+GsmsXVo2rCc0IbRaVHeeRXJJ0gbsyKDcIwDdAzYySOubkFCvkV32+7Cw) 进行实时讨论 - 🔍 搜索 [现有 Issues](https://github.com/imsyy/SPlayer/issues) 查看是否有类似问题
Author
Owner

@kazukokawagawa commented on GitHub (Dec 30, 2025):

收到反馈,我们会着手准备修复工作,请等待

<!-- gh-comment-id:3700042327 --> @kazukokawagawa commented on GitHub (Dec 30, 2025): 收到反馈,我们会着手准备修复工作,请等待
Author
Owner

@MoYingJi commented on GitHub (Dec 30, 2025):

怎么感觉是你绑了什么奇奇怪怪的快捷键呢

<!-- gh-comment-id:3700053874 --> @MoYingJi commented on GitHub (Dec 30, 2025): 怎么感觉是你绑了什么奇奇怪怪的快捷键呢
Author
Owner

@LYNXUTE commented on GitHub (Dec 30, 2025):

原本是因为我在那把vkmag75键盘上将f10f11f12分别绑定了暂停/上一首/下一首,然后播放器后台听歌那会儿还没什么,拉前台顺手按了f12绑定的下一首突然就乱了,一个按键触发了一堆东西,然后一研究有点挠头了,想着没辙就换键盘绑定吧,把功能键上下首换成了ctrl+箭头的全局切歌了。
然后我突然想,外接键盘的功能键本质上是笔记本的Fn+f1功能区,这玩意儿不会笔记本键盘也触发吧,试了下还真是,笔记本键盘都不需要按后续按键,只要播放器聚焦在前台,按下Fn键就触发一堆指令,给我彻底整不会了

MoYingJi @.***> 于 2025年12月31日周三 01:43写道:

MoYingJi left a comment (imsyy/SPlayer#689)
https://github.com/imsyy/SPlayer/issues/689#issuecomment-3700053874

怎么感觉是你绑了什么奇奇怪怪的快捷键呢


Reply to this email directly, view it on GitHub
https://github.com/imsyy/SPlayer/issues/689#issuecomment-3700053874, or
unsubscribe
https://github.com/notifications/unsubscribe-auth/AYBXXTWUTM2AEK6SL52KABD4EK2TLAVCNFSM6AAAAACQKTUHB6VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZTOMBQGA2TGOBXGQ
.
You are receiving this because you were mentioned.Message ID:
@.***>

<!-- gh-comment-id:3700078595 --> @LYNXUTE commented on GitHub (Dec 30, 2025): 原本是因为我在那把vkmag75键盘上将f10f11f12分别绑定了暂停/上一首/下一首,然后播放器后台听歌那会儿还没什么,拉前台顺手按了f12绑定的下一首突然就乱了,一个按键触发了一堆东西,然后一研究有点挠头了,想着没辙就换键盘绑定吧,把功能键上下首换成了ctrl+箭头的全局切歌了。 然后我突然想,外接键盘的功能键本质上是笔记本的Fn+f1功能区,这玩意儿不会笔记本键盘也触发吧,试了下还真是,笔记本键盘都不需要按后续按键,只要播放器聚焦在前台,按下Fn键就触发一堆指令,给我彻底整不会了 MoYingJi ***@***.***> 于 2025年12月31日周三 01:43写道: > *MoYingJi* left a comment (imsyy/SPlayer#689) > <https://github.com/imsyy/SPlayer/issues/689#issuecomment-3700053874> > > 怎么感觉是你绑了什么奇奇怪怪的快捷键呢 > > — > Reply to this email directly, view it on GitHub > <https://github.com/imsyy/SPlayer/issues/689#issuecomment-3700053874>, or > unsubscribe > <https://github.com/notifications/unsubscribe-auth/AYBXXTWUTM2AEK6SL52KABD4EK2TLAVCNFSM6AAAAACQKTUHB6VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZTOMBQGA2TGOBXGQ> > . > You are receiving this because you were mentioned.Message ID: > ***@***.***> >
Author
Owner

@github-actions[bot] commented on GitHub (Feb 2, 2026):

🤝 您好 @LYNXUTE,感谢您的反馈!
由于无法复现问题,我们无法修复
请确保您已经详细描述了问题的复现步骤,维护团队会尽快查看

<!-- gh-comment-id:3832669141 --> @github-actions[bot] commented on GitHub (Feb 2, 2026): 🤝 您好 @LYNXUTE,感谢您的反馈! 由于无法复现问题,我们无法修复 请确保您已经详细描述了问题的复现步骤,维护团队会尽快查看
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/SPlayer#328
No description provided.