Tobatsu · 视频二次编辑

字幕 + 画中画二次编辑

现状 · 我们的疑问 · 能不能做 · 怎么做 —— 一份给产品 / 前端 / 后端对齐的总结。

2026-06-30 · 结论:能做,引擎都现成;字幕先行,画中画二期

一句话结论

能做,而且两个重渲引擎都已经在线上(不用新建)。 出片时把"重渲所需的原材料"全挂在最终成片这一个结果下面,成片卡就成了一个自包含的"可重编辑工程";用户选中它,前端就能拉出全部输入做预览和重新生成。

发配置,不发 ASS。断句用 line-groups。字号 / 行数一律以后端为准。

2
现成的重渲引擎
subtitle_burn_in · video_pip_compose_mai
字幕重编辑
缺口小,第一期
画中画重编辑
数字人已返回,只差合成参数快照

1 · 现状:我们手上有什么

combo / superdub 出片后,最终成片(out_primary)其实已经返回了 6 个产物

产物是什么对重渲的作用
out_primary最终带字幕成片工程入口(卡片)
out_pip_composite无字幕合成视频(主视频+数字人,已混音)字幕重烧的底片 = noSubtitleVideoURL
out_subtitleSRT 字幕文件= srtURL
out_digital_human数字人口播原片(开抠像就是透明 webm)画中画重合成的 pip 路 —— 已经返回了
out_audio口播音频
out_anchor锚图

out_primary 现在已经用一个透传袋(canvas_extra)把 srtURL / noSubtitleVideoURL 挂在自己下面 —— "原材料挂成片下面"这个机制已经有雏形了,只是材料还没挂全。

两个下游引擎(都是线上现成工作流)

2 · 我们一路上的疑问,和最终答案

Q1发 ASS 还是发配置? → 发配置。ASS 是渲染产物,前端没法编辑;配置(line-groups + 几个样式字段)是干净 JSON,改起来轻松,还能保留预设和智能定位。

Q2断句(拆句/合并)怎么做,会不会很难?最简单的部分。断句就是改 line-groups 里的 page_index / word_indices 分组;每屏时间 = 该屏所有词的 min(start)~max(end),前端一行不用算时间

Q3字号 / 最大行数怎么对齐?一律以后端为准。字号是真实渲染像素(不是预览 px),后端给基线、前端按比例缩;最大行数后端定(默认同屏 ≤2 行,超出走滚动)。前端预览必须读后端返回的规格,不自己猜。

Q4"重做"是拿哪个视频做输入? → 这个框架本身要纠正:不能拿"已烧字幕的成片"去重做画中画(字幕烧死了会带进新合成)。正确是按流水线分层,改哪层就从哪层往下重跑(见第 4 节)。

Q5pip 和 burn 拆成两个独立下游,组合场景是不是就不好做? → 不会。引擎拆开是对的;组合场景别让前端去拼两步,用一个后端重渲任务把 compose→burn 串起来、按需只跑需要的那段(见第 4 节)。

3 · 能不能做:能,缺口如下

能力引擎combo 是否已返回重渲输入要补
字幕重编辑subtitle_burn_in ✅无字幕底片 ✅ / line-groups ❌① 把 line-groups 挂到成片下 ② subtitle_burn_in 开结构化入口
画中画重编辑video_pip_compose_mai ✅数字人 ✅ / 主视频≈原始输入 / 合成参数 ❌把"合成参数快照"挂到成片下(数字人已有,引擎现成)

两侧缺口都不大。字幕侧最轻(就差 line-groups 返回 + 一个结构化入口);画中画侧因为数字人本来就返回了,现在主要差一份"这次用了哪些 PIP 参数"的快照,好让前端恢复状态。

4 · 怎么做(核心设计)

(a) 原材料全挂"最终成片"下 —— 成片卡 = 可重编辑工程

你说得对:把重渲要的东西都挂在 out_primary 下面,选中成片就能重编辑。扩展现有的 canvas_extra 透传袋即可:

最终成片 out_primary 用户选中这张卡 → 重编辑 canvas_extra(挂在成片下的原材料) noSubtitleVideoURL无字幕底片 ✅已有 srtURL ✅已有字幕文件 digitalHumanURL ✅已有数字人(pip 路) lineGroupsURL ✕缺断句+词级时间 composeParams ✕缺PIP 配置快照 subtitleStyle ✕缺当前字幕样式

绿色 = 现在已经返回 / 已挂;红色 = 要补挂的。补齐后,成片卡自带全部重渲输入。

(b) 分层重渲:改哪层,就从哪层往下重跑

主视频 + 数字人(原材料) PIP 合成video_pip_compose_mai 烧字幕subtitle_burn_in 改 PIP → 从这里跑 只改字幕 → 从这里跑 改了 PIP 必然连带重烧字幕(合成视频变了)—— 这个依赖后端兜,不要推给前端

(c) 一个重渲入口,按需 compose→burn(别让前端拼两步)

引擎拆开(可复用),但面向"统一编辑器"的提交,落到一个后端重渲任务:PIP 变了就 compose、字幕总要 burn、只改字幕就跳过 compose。"改 PIP 必带重烧"这个硬依赖在后端内部处理,前端只交一次配置。combo 的 runner 本来就有 compose + burn 两段,复用现成代码

(d) 预览要准:后端给"渲染规格",前端镜像

字号 / 行数归后端后,前端预览必须用后端返回的规格去画,不能自己猜:每种画幅的真实字号基线、按视频尺寸算好的安全边距 + ≤2 行换行结果、四个预设的视觉定义、位置锚点公式、PIP 几何。这样"预览 == 重生成结果"才成立。

5 · 分期建议

第一期字幕重编辑闭环。补:① line-groups 挂到成片下 ② subtitle_burn_in 开结构化入口。把"断句 / 跟读效果 / 字号 / 上下位置"全闭环 —— 全是已有能力,纯接线。
第二期画中画重编辑。补:合成参数快照挂到成片下;引擎(video_pip_compose_mai)已就绪,数字人已返回。再补"左右位置 / 同屏多行"等需要动渲染核心的能力(看产品优先级)。
统一两期共用一套"可恢复合成元数据"契约(都挂在最终成片下),只是字段不同。

待产品拍的点:① 第一期范围 = 只字幕,还是字幕 + 画中画。② 字号 / 最大行数确认以后端为准(默认同屏 ≤2 行)。③ 是否接受"改画中画会连带重烧字幕"这个链路依赖。