镜内切入优于拆镜:保住下游帧锚 · 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:切走了,本镜的字卡就该收掉
};
渲染层判断”当前帧是否落在窗口内”,落在窗口内就渲切入画面,否则走原渲染器。
四个关键细节:
- 硬切,不加淡入淡出。剧本要的是”切”(S26 更是明写 0.3s 闪现),加淡会把切的力道洗掉
- 切入期间收掉本镜的屏幕字卡。已经切走了,字还挂着就露馅
- 素材未到位时整段忽略,画面与上一版逐像素同路径——承接位不能改变现状
- 闪现类给
push: 1。0.3s 里推镜看不出来,只会糊
校验
改完至少核这四项与改前一致:总帧长 / 镜头数 / 各幕起点 / 那个对外承诺的帧号。 本项目改后:5338f = 2:57.93、37 镜、S37 = 5158f,与改前逐一致。
再补一次真机:临时把一张现成素材接进切入字段,渲窗口内、窗口外各一帧。 编译通过只证明类型对,渲出来才知道图铺满了、字卡收掉了。验完回滚。
什么时候反而该拆镜
- 这一段要独立的转场(拆镜才有
TransitionSeries的 presentation 可挂) - 这一段要独立的时长调参,会反复改(塞在别人肚子里改起来别扭)
- 下游还没有任何帧锚(项目早期,随便拆)
判据是”下游有没有已承诺的帧号”,不是”这段内容重不重要”。
边界
- ⚠️ 单项目 4 处(S17 / S20 / S29 的下半脸特写 + S26 的 0.3s 卧室闪现),机制已真机验证,但成片尚未重渲
- 只适用于”起点由累加推出”的时间轴结构。如果编辑器是绝对时间轴、拆镜不影响后面,这条不成立
- 切入若需要独立音频事件,仍要手动对齐两处帧号(本项目 S26 的画面 insert 与
s26_room音频事件同为第 90 帧,改一个必须改另一个)——这是本机制留下的唯一手工耦合点
关联文档
- 2026-08-26_擦干净_剧本口径审计与补图承接位_复盘_v1 —— 来源案例
- 蒙眼剪辑法_方法论笔记 —— 母方法论:时间轴由代码推,不手算
- L-cut卡点+xfade时长抵消_v1 —— 同族:转场重叠对总时长的影响要显式算
- 图片占位到视频替换的工作流_v1 —— 同族:承接位先建、素材后填
- 绿勾只覆盖它自己那张清单_v1 —— 同次沉淀
- 04_方法论与洞察索引