给 IINA 加上长按倍速:左右键加速慢放,短按快进退
平时在手机或网页上看视频,长按倍速、松开恢复原速用得很顺手。但在 Mac 上用 IINA 时,左右方向键默认只能固定快进/快退 5 秒。想快速过一下无聊片段时狂按快进容易跳过关键内容,按住不放又完全没反应。GitHub issue 里早有人提过这类需求(比如 #4437、#4929),但官方一直没有内置。
其实写一个 IINA 原生 JavaScript 插件就能解决:按住右键 2.0× 加速,按住左键 0.5× 慢放,松手恢复原速;轻敲短按一下依然是快进/快退 5 秒。
把插件代码和几个踩坑点记在这里,换机时直接复制就能用。
为什么不用 mpv Lua 脚本?
IINA 底层是 mpv,写 ~/.config/mpv/scripts/ 下的 Lua 脚本看起来最省事。但实际测试下来问题不少:
- 松手事件经常丢失:IINA 的 Cocoa 界面会拦截输入,mpv 动态绑定的按键经常收不到
up(按键松开)事件,导致手都松开了视频还在 2 倍速狂飙; - 系统报警音:长按方向键触发系统键盘连发时,IINA 没法干净地消费底层事件,系统会一直发出“咚咚咚”的无效按键提示音;
- 调不到原生 UI:没法使用 IINA 自带的 OSD 提示和偏好设置面板。
而从 IINA 1.4.0 开始支持的原生 JavaScript 插件系统,提供了 iina.input.onKeyDown 和 iina.input.onKeyUp,官方文档本身就提到这两个接口适用于“hold to speed / hold to seek”,能很好地处理长按拦截和松手还原。
实现细节与踩坑点
开发过程中有几个值得注意的细节:
1. 过滤系统按键自动重复(isRepeat)
在 macOS 里长按一个键,系统会在短暂延迟后以很高的频率连续发送 KeyDown。如果不处理,长按过程中会频繁重置计时器或重复触发命令。
IINA 插件 API 的回调参数里自带了 data.isRepeat,只要判断为重复事件就直接拦截:
input.onKeyDown("RIGHT", (data) => { |
通过返回 true 并声明 input.PRIORITY_HIGH,不仅可以过滤自身状态,还能彻底消除系统的“咚咚”报警音。
2. 短按快进与长按倍速兼得
日常看视频时,轻敲一下快进几秒微调进度的需求很常见,不能为了长按加速把短按快进搞丢了。
这里加了一个 250ms 的定时器:
- 按下时启动计时;
- 如果在 250ms 内松开(轻按短敲),清除定时器,正常执行快进/快退 5 秒;
- 如果按住超过 250ms(长按),进入倍速播放,松手时恢复。
3. 记住原本速度与暂停状态
- 原本速度:如果视频原本就在 1.25× 播放,松手后应该回到 1.25×,而不是死板地重置为 1.0×。在长按前读一下
mpv.getNumber("speed")存起来即可。 - 暂停状态:暂停时长按右键,一般是想快进看看画面。这时候顺便把
pause设为false,松手时恢复倍速的同时也自动恢复暂停。
4. mpv.command 的参数必须是字符串数组
写短按快进时,顺手写了 mpv.command("seek", 5),结果长按加减速正常,短按快进却毫无反应。
翻了 API 文档才发现,IINA 插件封装的 mpv.command 参数类型严格要求是 string[]:
mpv.command(name: string, args: string[]): void |
传数字会在 Swift 桥接层直接报错退出。正确的写法必须把秒数转为字符串,并带上相对寻轨参数:
// 快进 5 秒 |
5. 解绑默认的左右键快捷键
IINA 自带的快捷键预设优先级很高,会抢在插件前把左右键给拦截了,导致插件收不到松手事件。
解决方法很简单:在 ~/Library/Application Support/com.colliderli.iina/input_conf/ 里放一份配置文件(比如 ArrowSpeed.conf),保留其他所有默认按键,只把 RIGHT seek 5 和 LEFT seek -5 注释掉,让左右键完全交给插件处理。
完整源码
插件由 3 个文件构成,存放在 ~/Library/Application Support/com.colliderli.iina/plugins/com.antigravity.iina-arrow-speed.iinaplugin/ 目录下。
1. Info.json(清单配置)
{ |
2. main.js(核心业务脚本)
// Arrow Key Speed Control — IINA Plugin |
3. preferences.html(偏好设置面板)
可以在 IINA 偏好设置中以图形化滑块调节数值,适配系统的暗色与浅色外观:
|
一键配置与生效
为确保 IINA 的默认快捷键不抢占事件,我们在 input_conf 目录下生成专属配置,并通过 defaults 激活插件与配置文件:
# 1. 复制官方默认快捷键,并解绑左右方向键 |
配置完成后重启 IINA(Cmd + Q 彻底退出后再打开),长按倍速与短按快进即可正常工作。