阿江
← 返回工具箱
FIELD NOTES / 406Ego Lite × Remotion B-roll

只给了字幕和音频,
聊了十几轮,做出 9 段 B-roll。

这期讲 Ego Lite 的 Windows 版。我自己录了几段实操,没录到的地方全交给 Agent 做成动画。我给它的只有逐字稿 SRT、已有录屏的时间段、口播音频和一些截图。

下面按顺序还原整个过程:模板怎么选,哪里被我打回,最后怎么对齐到每一句话。所有预览都能直接播放,和 4K 成片是同一份代码。

成片画面:蓝天渐变背景上写着 Windows 版终于来了,下面是 Ego Lite 的欢迎页和导入窗口
THE FINAL CUT · 02 / 09直接播放 9 段预览 ↓

先看成片,
9 段都能直接播。

下面就是我审片用的预览页,和 Remotion 渲染 4K 时跑的是同一份场景代码,这里看到的就是成片。点段落切换;勾选「带上配乐音效」能听到成片里的音效和配乐,口播同步播放;勾选「叠上头像和字幕」能看到剪辑时头像和字幕压在哪里。

交互预览 · 9 段共约 350 秒 · 只含 B-roll,我实录的部分不在这里新窗口打开 ↗

为了在网页里流畅播放,预览里的口播和配乐是 MP3,录屏片段是压缩过的 MP4;成片是 3840 × 2160 / 30fps。第一次打开要加载约 30 MB 素材。哪些画面是示意、不是实录,写在预览页最下面。

我只给了四样东西。

SRT

最终逐字稿

剪辑后的字幕,268 条,全片 7 分 40 秒。Agent 靠它知道每句话在什么时间说。

时间段

已经实录的区间

01:00–01:19、01:51–02:30、03:04–03:45、04:06–04:16。这四段是我在 Windows 上录的,不用做。

音频

口播

从母版导出的口播。预览时同步播放,方便我边听边看画面对不对。

素材

截图

10 张抖音和 B 站的评论截图、两期播放数据、GitHub 源码页。官网和 logo 是 Agent 自己用 ego-browser 抓的。

其余时间都要用 B-roll 盖住,因为这期母版里只有提词器和右上角的头像。算下来 9 段、约 350 秒,占了全片七成多。

开工前还先砍了一刀:Agent 按这个 Skill 的分工,把飞书里的录屏清单从 6 条减到 3 条。动画能讲清楚的就不录,比如“半路接管”这种两边对比的画面。

这个 Skill 怎么干活

场景只写一次

scenes.js 里写 HTML 和动画声明。预览页和 Remotion 跑同一份代码,所以预览里确认的就是成片。

模板是可替换的一层

版式、配色、字体、音色、配乐都在模板里。换模板不用重写内容,这一点后面帮了大忙。

只在预览这里停

预览确认之前反复改;确认之后不再写方案,一路渲染到交付。

第一套模板,
我直接否了。

Agent 先用了我在主题库里存过的「纸白信号橙」,拿第 02 段做样板。我看完只回了一句:“模版太丑陋了,我不要这个。”

纸白信号橙模板:白底、橙色强调
主题库里「纸白信号橙」的模板封面。当时的样板段没有留下,这里用模板封面示意。

于是我让它开两个 subagent 对抗。同一段 19 秒,各做一版,做完把对方的作品发过去挑刺:指出最致命的 3 个问题,也承认对方比自己好的 2 点,再各改一轮。

A · 晴空发布会

从 Ego Lite 自己的品牌出发:蓝天穹顶渐变、细体配粗体的标题,真实窗口放进透视里,镜头一直慢推。

B · 阿江手记

从我个人网站出发:暖纸底、宋体标题、截图当带图注的插图,结论用手绘圈注。

A 版:蓝白底上的四张评论卡
A / 评论区
B 版:暖纸底上像剪报一样贴着的评论
B / 评论区
A 版:蓝天渐变上的 Windows 版终于来了
A / Windows 版终于来了
B 版:宋体标题配安装引导录屏
B / Windows 版终于来了

两边互相挑的刺

A 说 B

暖纸配宋体,跟刚被否掉的纸白信号橙是一个味道。

B 说 A

大面积蓝渐变加极细配粗黑的标题,换个 logo 就能套到任何产品上,看不出是我的频道。

结果

Agent 推荐 B,理由是有频道辨识度、更好延展。我选了 A:这期是产品发布,我更看重发布片那种质感和冲击力。

说到哪个,
画面才出现哪个。

模板定下后,剩下 8 段分给 4 个 Agent 并行开发,约半小时后出了第一版全片。我看完的反馈是:有时候我说的台词跟画面对不上。

Agent 第一次理解成“标题出早了”,写脚本把 102 条上屏文字和字幕时间比了一遍,修了十几处。但我说的不是这个,于是截了一张图给它:

预览截图:标题是一直在高强度用,中间却已经是 Google Chrome 图标
我当时的截图:口播还在说“一直在高强度去用”,Chrome 的图标已经出来了。它应该在说到“把 Chrome 替换掉”时才出现。

我还提了第二点:图片用得太多,来来回回就是那几张截图换来换去。不合理的地方应该用 HTML 自己搭界面和动画,这样更真实。

这一轮整体重做,做了四件事:

  1. 逐句分镜表:9 段约 230 句台词,每句定好画面,标明用真实素材还是 HTML 搭。截图只用在需要证明的地方(评论、播放数据、源码、Excel 结果、官网、实录片段),同一张全片最多出现两次。
  2. 台词锚点:每个图标、窗口、截图都写成“说到某个词时出现”,时间按字幕查到词,默认提前 0.12 秒,不再手写秒数。
  3. 公共界面组件库:浏览器窗口、Space 标签条、光标点击、终端逐字输入、表格逐行填入、验证码、Token 计量……4 个 Agent 共用一套,质感统一。
  4. 两道检查:脚本比对每个元素的出现时间和说出那个词的时间,差超过 0.45 秒就报出来;再截“台词 | 画面”逐句对照图,逐格看。
broll/scenes.js
锚点是怎么写的(节选自本期 scenes.js)
// scenes.js 头部(节选):按 SRT 查出某个词开口的时间
function SAY(seg, word, nth) { … }
// 相对当前场景的秒数,默认比开口早 0.12 秒
function AT(sc, seg, word, off, nth) {
  return +Math.max(0, SAY(seg, word, nth) - (sc && sc.from || 0) + (off == null ? -0.12 : off)).toFixed(2);
}

// 第 01 段「把 Chrome 替换掉」这一页(节选)
// 说到“Chrome”时 Chrome 图标才出现,“替换掉”时被划掉、向左推走,ego 图标从右边顶进来。
build: function () {
  var tC = at(this, 'Chrome'), tX = at(this, '替换'), tR = at(this, '替换掉');
  return … + TT('把 <b class="hl">Chrome</b> 替换掉了', tC) +
    UI.icon('chrome', { t: tC, strike: tX, out: tR + .15, outFx: 'left', label: 'Google Chrome' }) +
    UI.icon('ego', { t: tR + .2, fx: 'right', label: 'ego (lite)' }) + …;
}
逐句对照图:每格上方是台词和时间,下面是对应时刻的画面
一个开发 Agent 交上来的逐句对照图(第 01 段开头,晴空模板时期)。每格上方是台词和开口时间,下面是那一刻的画面。
broll-sync-audit.mjs
同步核对脚本对成片版本的实际输出
$ node broll-sync-audit.mjs http://localhost:8877/ 0,1,2,3,4,5,6,7,8
-- seg0: 29 个锚定元素
-- seg1: 1 个锚定元素
-- seg2: 19 个锚定元素
-- seg3: 28 个锚定元素
-- seg4: 14 个锚定元素
-- seg5: 25 个锚定元素
-- seg6: 40 个锚定元素
-- seg7: 25 个锚定元素
-- seg8: 28 个锚定元素
NOSAY seg7 [04 速度与省 Token] 省很多 Token @54.43
(NOSAY:有入场动画、但没锚到台词的元素,逐个人工确认,节选一条)
锚定元素全部同步

重做后的 v4,208 个画面元素锚到了台词上,偏差全部在 0.45 秒以内(成片版本是 209 个)。拿开头举例:说“高强度去用”时,Ego Lite 里标签页一个接一个打开;说“改成默认浏览器”时,系统设置里选中 ego lite;说到“Chrome”那一刻 Chrome 图标才出现,接着被划掉推开。

成片:把 Chrome 替换掉了,右侧卡片里是 Chrome 图标
成片:Chrome 图标只在“把 Chrome 替换掉”这一句出现。

看完全片,
我换成了便签复盘。

v4 每句都对齐了。我看完整片,最后说:“我们选择便签复盘这个。”晴空只是在一段 19 秒的样板里赢了,铺满 9 段之后,我更想要方格纸、粗黑标题、橙色强调这种复盘的感觉。

因为场景写的是内容,换模板代价不大。Agent 在便签复盘上加了一层兼容样式,让晴空时期的场景也能套上新样式。内容和对时全部沿用,换完重跑核对,依然全部同步。

晴空版:三层分工
BEFORE / 晴空 v4 · 三层分工
便签版:三层分工
AFTER / 便签复盘 · 同一时刻
晴空版:4 个最核心的区别
BEFORE / 晴空 v4 · 4 个区别
便签版:4 个最核心的区别
AFTER / 便签复盘 · 同一时刻

只有“Windows 版终于来了”那一页保留了晴空版式。换完我觉得它不如原来好看,就把晴空的发布页版式移植了回来,也就是文章开头那张图。

最后几处,
都是我盯出来的。

① 截图没铺满窗口

源码截图在窗口里只占了一角。Agent 自己截图检查时是正常的,换到我的浏览器就短一截,原因是 3840 宽的原图靠偏移裁切。改成先用 PIL 裁好再放进窗口。

修之前:源码截图只占窗口一角
BEFORE / 我截的图
修之后:GitHub 页面铺满窗口
AFTER

② 图标有 AI 味

渐变底加四角星的 Agent 图标,我一眼就说“太像 AI 生成的了”。全片去掉了渐变,Agent 换成终端图标。这条也记进了 Agent 的长期记忆。

修之前:渐变底四角星图标
BEFORE
修之后:黑底终端图标
AFTER

③ 评论只放了 4 张

“Windows 用不了”那页原来只放了 4 张评论。我说评论那么多,应该慢慢堆起来、加上音效。现在从说到“评论区”开始,10 张评论每 0.26 秒落下一张,每张带一声落卡音效,压在下面的逐渐变暗。

修之前:4 张评论卡
BEFORE / 4 张
修之后:10 张评论堆在一起
AFTER / 10 张,逐张落下

④ 预览切段要缩放一下才正常

切到第二段时画面比例乱了,要把浏览器缩放到 110% 再恢复才正常。原因是切段时重设舞台样式,把缩放也一起清掉了;在构建完成后补一次 fit() 就好。这个修在 Skill 的预览外壳里,以后的工程都受益。

确认之后,
一口气渲染到交付。

我说“可以渲染成片了”之后就没再介入。Agent 用 Remotion 渲染了 9 段 4K 成片,文件名就是要盖住的时间段,附一份替换对照表,我直接拖进剪辑时间线对位。

3840 × 2160 30fps配乐比口播低 16 dB峰值 ≤ -18 dBFS成片不含口播

FILE NAME

1_Windows终于来了_00-00-40,767~00-01-00,200_字幕33-43.mp4

交付时它说清楚了验证到哪一步

脚本验证过的

每段帧数等于区间长度,分辨率、帧率、命名正确,响度和峰值在范围内。

看过的

渲染前抽了 68 帧和预览比对,录屏片段确认在动,没有停在第一帧。

没验证的

Agent 没有试听,明确让我自己听一遍,尤其是评论堆那 10 声卡片音效。

想自己做,
从这几步开始。

安装 B-roll Skill
npx skills add NanmiCoder/ajiang-vibe-coding-skills --skill ajiang-video-broll
  1. 01

    安装 Skill,把最终版 SRT、初剪视频或口播音频交给 Agent。

  2. 02

    标出已经有实录、不用做 B-roll 的时间段,其余的才交给它做。

  3. 03

    先挑一段做样板。模板不满意,就让两个 Agent 各做一版、互相挑刺。

  4. 04

    样板确认后再并行开发其他段。要求每个图标、窗口、截图都锚到说出它的那个词,并跑同步核对。

  5. 05

    看完整片再定模板。截图先预裁,少用渐变和四角星这类有 AI 味的图标。

  6. 06

    预览确认后再渲染 4K。Agent 只能测响度,声音要自己听一遍。

THE IDEA

我给的只是字幕和音频,真正花时间的,是一句一句说清楚哪里不对。

素材与画面来源说明

交互预览与成片使用同一份场景代码和素材,口播、配乐与录屏片段为网页压缩版。文中成片截图从这份预览截取。晴空 v4、A/B 两版的截图,用当时保留的工程和场景代码重新构建后截取;纸白信号橙当时的样板没有保留,用的是模板库封面。“修之前”的三张是我审片时的原始截图。

官网的 Windows 下载页、默认浏览器设置、Codex 窗口、验证码、半路接管和速度对比等是示意画面,不是实录;完整清单在预览页底部。本期使用的「便签复盘」兼容层是为这期做的,Skill 里公开的是便签复盘原模板。