技术
Kamo 的自动缩放是怎么工作的
从原始的鼠标点击,到顺滑运镜的镜头。每一次缩放背后的分组规则、时间安排和弹簧物理。
· 阅读约 5 分钟 · 作者:Doug Siqueira
Kamo 录制中的每一次点击,都会变成一个仿佛有人在掌镜的缩放。这里没有用到 AI,只有几条简单的规则和一点物理。下面是完整的配方。
1. 什么算一次点击
录制时,Kamo 会把鼠标的移动、点击和滚动写进一个文件,和视频用同一个时钟。项目第一次打开时,Kamo 会读取这些事件,只看录制范围内的 左键按下。
- 右键和中键点击永远不会触发缩放。
- 滚动和单纯的移动永远不会产生缩放。
- 录制窗口或区域之外的点击会被忽略。
2. 把点击分组成镜头
如果每次点击都单独缩放一次,填个表单画面就会像手持手机拍摄一样晃个不停。所以 Kamo 会把点击分组成 镜头。一次点击要加入当前镜头,必须同时满足这两个条件:
- 它发生在上一次点击松开后 不到 1.5 秒 内,并且
- 它落在距离该镜头 第一次 点击 屏幕对角线四分之一 的范围内(在 1080p 屏幕上大约 550 px)。
从第一次点击开始量,而不是从最后一次,这一点很重要:否则一连串的小步挪动可能会把镜头一路带到屏幕另一头。
3. 时间安排
每个镜头在第一次点击 之前 0.3 秒 开始,这样点击落下时观众已经在看正确的位置;在最后一次松开 之后再保持 1 秒。一个镜头至少持续 0.6 秒。如果两个镜头会重叠,就合并成一个。
镜头默认放大到 2×,对准该镜头所有点击的平均位置;在画面边缘会往里收一点,保证永远不会露出视频以外的东西。在缩放过程中,镜头会轻柔地跟随光标,略带拖拽感。
4. 弹簧
缩放从不使用线性缓动。镜头是一个 阻尼弹簧(刚度 170,阻尼 26),就是你在好的手机动画里感受到的那种运动:起步快,减速顺滑,停下时不晃。
有两个细节让它感觉对味:
- 弹簧是用闭式解 精确 求解的,而不是一步一步模拟。任何帧率都得到同一条曲线,所以预览和 60 fps 导出完全一致。
- 弹簧大约需要 0.6 秒到位,所以镜头会 在点击之前就开始移动,并在一帧之内落到点击位置上。紧挨着的缩放会直接从一个目标移到下一个,中间不会先缩小再放大。
5. 光标也坐同一个弹簧
Kamo 录制屏幕时 不 带 Windows 光标,而是根据鼠标轨迹自己画一个。它在每个坐标轴上使用同样的弹簧。因为整条轨迹事先都已知,光标可以提前大约 150 ms“看”向前方,所以它滑动时不会落后于你的手。每次点击时,剩余的误差会被渐渐消除,让光标在点击那一帧 精确 落在点击点上。
6. 最终决定权永远在你
每个缩放都会以块的形式出现在时间轴上。拖动、拉伸、调整倍数、删除,或者双击新增你自己的。你动过的块会变成 手动 块,而 “重新生成缩放” 只会替换自动生成的那些。
整个过程是确定性的(同样的录制,得到同样的缩放),而且很快:一段 10 分钟录制的缩放,不到一秒就能生成。
如果你想读代码,它是开源的;你现在也可以在浏览器里试试缩放效果。
