方法论与洞察

镜内切入优于拆镜:保住下游帧锚 · v1

一句话律:代码化剪辑里要在一镜之内切一下再切回来,不要拆镜—— 拆镜会改动全片的起点帧表,而下游那些已经对外承诺过的帧号(互动点、章节点、卡点)会跟着漂。 改成在本镜时长内部做一次硬切,时间轴一帧不动。

入档:2026-08-26 验证状态:⚠️ 初次发现(单项目 4 处,机制已真机验证,成片未重渲) 来源:2026-08-26_擦干净_剧本口径审计与补图承接位_复盘_v1


场景

剧本里常有这种写法:

S17(9s 一整镜)……5.6-7.0s:【关键画面】定格,他笑了,下半脸特写……7.0-9.0s 过曝白光吞没

一个镜头,中间切 1.4s 到另一个画面,再切回来。 分镜表上它不是一个独立镜号,它是这一镜内部的一次强调


直觉方案为什么是错的

直觉是把 S17 拆成 S17a / S17b(特写) / S17c 三段。代价:

TransitionSeries 这类”起点由前面所有镜头累加推出”的结构里, 拆一镜 = 后面每一镜的起点帧全部重算。转场重叠还会让它不是简单加法。

而下游挂在帧号上的东西通常已经对外承诺过了:

下游本项目的实例
平台互动点B 站互动分支节点 5158f = 2:51.93,要填进后台
音频事件表27 条音效按 at('S17', 100) 这类相对帧定位
章节点 / 卡点 / 字幕同理

拆一个镜头,换来的是把这些全部重新核对一遍——而其中至少一个已经写进了别处的配置。


做法

给镜头加一个”镜内切入”字段,它消费的是本镜已有的时长,不新增时长

export type SceneInsert = {
  at: number;               // 相对本镜起点的帧号
  durationInFrames: number; // 切入持续帧数
  asset?: string;           // 素材;留空 = 整段忽略
  push?: number;            // 切入期间推近终值,填 1 = 完全静止
  keepScreenText?: boolean; // 默认 false:切走了,本镜的字卡就该收掉
};

渲染层判断”当前帧是否落在窗口内”,落在窗口内就渲切入画面,否则走原渲染器。

四个关键细节:

  1. 硬切,不加淡入淡出。剧本要的是”切”(S26 更是明写 0.3s 闪现),加淡会把切的力道洗掉
  2. 切入期间收掉本镜的屏幕字卡。已经切走了,字还挂着就露馅
  3. 素材未到位时整段忽略,画面与上一版逐像素同路径——承接位不能改变现状
  4. 闪现类给 push: 1。0.3s 里推镜看不出来,只会糊

校验

改完至少核这四项与改前一致:总帧长 / 镜头数 / 各幕起点 / 那个对外承诺的帧号。 本项目改后:5338f = 2:57.93、37 镜、S37 = 5158f,与改前逐一致。

再补一次真机:临时把一张现成素材接进切入字段,渲窗口内、窗口外各一帧。 编译通过只证明类型对,渲出来才知道图铺满了、字卡收掉了。验完回滚。


什么时候反而该拆镜

判据是”下游有没有已承诺的帧号”,不是”这段内容重不重要”。


边界


关联文档

类型/风格审美主题/代码化剪辑工具/Remotion