剪辑软件到哪里为止,模型从哪里开始。
在大多数工具里,有一道接缝。你导出,你上传,你等待,你下载,把结果放回去,然后指望它还对得上。接缝的一侧是你的项目,另一侧是一个从没听说过这个项目的程序。Sparkle没有这道接缝,而去掉它,就是这一页上大部分工程的内容。
剪辑软件就是一份文档,加上改变它的那些操作
面板之下,剪辑软件只是一样东西:一份描述何时发生什么的文档,以及一组具名操作——改变它的唯一途径。切开一段素材、改变它的速度、设定一个颜色、加一条字幕轨。除此之外,没有任何东西碰得到这份文档。
这听起来像一个实现细节,实际上它就是整个架构。一旦操作是唯一的那扇门,之后所有要紧的事——撤销、并发、重放、对已发生之事的审计——就成了这扇门的性质,而不必逐个焊到穿过它的每一项功能上。
所以助手是另一个调用方,不是另一个程序
助手不生成代码,也不生成帧。它发出的是菜单项发出的那些具名操作,参数类型相同,写入的也是同一份文档。让它剪一版竖屏,它调用的就是剪辑软件本来就有的那个操作。
由此有两个结果,而两个都是要点。它表达不出剪辑软件做不到的事,因此不存在某一类AI产出需要事后与项目对账。而它做过的任何事,你自己也做得到——这意味着你可以读懂它、修改它,或者用手把它拆开。
一次操作,一次撤销
助手的一次操作可以动到一百段素材:改速度、改颜色、把每一条字幕重新设一遍样式。它仍然收拢为单个检查点,所以一次撤销就把你带回开口之前。
这不是一项便利。一个剪辑助手好不好用,不取决于它有多经常是对的,而取决于不同意它的代价有多低。一个你无法干净否决的助手,就是一个你必须盯着的助手,而盯着它比自己动手更贵。
模型是容易的那部分。围着它的一切,才是剪辑软件。
两只手,一份文档
一项耗时的操作在跑,你仍在继续工作,于是这份文档有了两个作者。天真的做法会丢掉一次修改:写得慢的那一方最后保存,悄悄覆盖掉另一方做过的事。
每一次保存,都是针对文档当前头操作的一次比较并交换(CAS)。建立在已经移动过的版本上的写入会被拒绝——不合并,也不悄悄应用。拒绝才是有用的行为:被拒的保存可以对着事实重试一次,而丢掉的修改,要等好几天后由做出它的人自己发现。
恰好一次,否则一次也不
助手计划里的一个步骤,迟早会遇上一次重试、一次双击、一次断线、一次刷新、一次跑到一半的崩溃,或者两个都认定这一步归自己的执行者。其中任何一种都可能把一次修改应用两遍,而在时间线上应用两遍的修改不是一份副本——它是另一条时间线。
所以执行者无权自行判断。在改动任何东西之前,它必须向计划存储认领这个步骤,由后者在锁下原子地授予;只有被授予的认领才构成对这次修改的授权,而一次重放会返回第一次的结果,不碰文档。证明一项操作发生过的,是一条被记录下来的操作ID,而不是浏览器标签页里的一个标志位。
模型就在时间线旁边,而不在一次上传的后面
抠像、分割和深度与剪辑软件跑在同一个进程里,用的是它手上已有的帧。没有导出,没有上传,没有等待,没有重新导入,事后也没有什么需要重新对齐。
这是一个关于延迟的设计选择,同时它了结了接缝通常留着不答的一个问题:处于保密期的素材仍然留在保密期内,因为它从未离开过。确实需要云端的那部分工作,走的是同一个网关,由它按提出请求的那个账户计量。
预览就是导出
拖动预览和最终渲染由同一批着色器绘制,所以你通过的就是你交付的。没有这一点,每一次AI修改都只是暂定:你认可的是一幅画面,文件还要留到之后再核一遍——这就是那道接缝在管线的另一端重新出现。
合起来看——一份文档、一组操作、一次撤销、一个头操作、一次执行、一条渲染路径——有意思的问题就不再是模型有多好,而是不同意它的代价有多低。我们做的正是这一部分。