AIGC 视频 · 本地路线 · 第二期

《机会成本》:把上一期提的四条改进,全部落地

120 秒竖屏知识短片,从「为什么免费的东西往往最贵」这个钩子进去。 这一期没有换路线,换的是执行—— 钩子、转场、字幕、人物、配色,以及把配乐交给剪映。

我的角色
独立完成:查证 · 旁白 · 分镜 · 渲染 · 配音 · 自检
成片
120.45 s · 54 屏 · 1080×1920 @30fps · 3615 帧
新写的基建
@vibe/pop —— 可复用的图元包
成本
¥0:零积分、零 API、零外部服务

一句话摘要

上一期做完《马太效应》之后,我自己列了四条必须改进的地方。 这一期就是那四条的落地验证——同一套本地流水线,把执行标准提上去。

顺便把上一期写死在组件里的版式,重写成了一个可复用的包。 以后每期只管填分镜表。

成片

2′00″(120 秒),竖屏 9:16。建议点开声音看。

视频本体 11 MB,为网页做了重新编码。抖音投稿版使用剪映配乐,此处为同一版内容的网页适配版本。

这一期改了什么

上一期渲完之后我给自己列了四条改进。这一期逐条对着做。

上一期的问题这一期怎么改的
开场没有钩子
直接讲现象,前 3 秒留不住人
第 1 秒就是「为什么免费的东西,往往最贵?」, 第 3 秒接第二个问题「什么都没干却总是没时间」,两个问句才进正题
画面单调、转场生硬
一屏一张静态图 + 淡入淡出硬切
54 屏 / 120 秒,平均 2.23 秒一切; 10 种转场全部用上(切 / 叠 / 擦 / 推 / 拉 / 缩 / 光圈 / 升 / 降 / 翻), 每屏进 15 帧、出 9 帧过渡,没有一屏是硬跳
没字幕、配色单一、缺人物
黑金很高级,但刺激不到多巴胺
底部逐句字幕带进度条(64 条); 配色从黑金扩到 6 个强调色 + 4 个中性色; 13 个火柴人(坐、想、指、摊手、搬、挥手…)+ 10 个图标位; 底部另加一条章节进度轴
音乐不该自己合成
脚本合成「不难听但也不加分」
脚本一行音乐代码都没写,只出「无声画面 + 纯人声 wav」, 配乐由人来做

把上一期的复盘结论当成这一期的验收标准,是我认为这次最值得记下来的做法。 复盘如果不写进下一条的需求里,它就只是一次自我安慰。

时长不是定出来的,是算出来的

第一期的做法是先定时长再往里塞文案,结果配音超长,最后靠变速硬压。 这一期反过来:先写旁白,用旁白的实测时长倒推片长。

35 句旁白合成后逐段去静音、量时长、排好气口,得到的总长就是 120.45 秒—— 不是「目标 2 分钟」,是「这句话说完刚好 2 分钟」。 写词时按实测的 5.9 汉字/秒折算,写完就知道片子大概多长。

这一期的规格:

项值
时长120.45 秒(由 35 句旁白实测时长倒推)
屏数54 屏,平均 2.23 秒一切
帧数3615 帧(1080×1920 @30fps)
字幕64 条逐句字幕,按标点断句、每条 ≤15 字,时长按字数占比分配
人物与图标13 个火柴人(9 种姿势)· 10 个图标位(8 种图标)
转场10 种全用:fade 9 / rise 7 / zoom 7 / cut 5 / push 5 / wipe 5 / iris 5 / pull 4 / flip 4 / drop 3
五幕钩子 0–12.9 · 岔路 12.9–35.3 · 破窗 35.3–67.7 · 你的账 67.7–103.0 · 收束 103.0–120.5

把版式重写成一个可复用的包

第一期的问题是:版式常量写死在组件里,改一个位置要翻遍代码。 这一期我把它重写成了独立的包 @vibe/pop—— 版式常量集中在一张表里,画面上每个元素待在哪个槽位是明确的。

代价是这一期多花了约 2 小时(全期最大的一块成本), 收益是以后每一期只管填分镜表,不用再碰渲染代码。

这个判断值得单独说一句

写完第一期的复盘时,我的结论是「画面和转场要更丰富」。 但真动手时发现,不先把版式抽象出来,就没法快速试那么多种转场和布局—— 每次改都要动代码,试错成本高到你不想试。

所以这 2 小时不是「顺手重构」,而是为了让改进本身成为可能而付的成本。 这个区别在做产品时经常被忽略:有些优化不是靠意志力,是靠先把工具造出来。

数字纪律:全片只引用 2 个数字

这条片子讲的是「你的时间账」,那种最容易顺口编数字的题材。 我的做法是:只锁定一份报告里的两个数,其余全部由它们算出来。

类型内容
直接引用(2 个)10.4 亿(用户规模)· 156 分钟(日均使用时长)
由这两个数算出949 小时 / 近 40 天 / 395 天 / 1186 天——全部是四则运算
史实年份1850(巴斯夏)· 1914(维塞尔命名)

出处:《中国网络视听发展研究报告(2025)》、巴斯夏《看得见的与看不见的》、 维塞尔 1914 年命名、曼昆《经济学原理》第二条原理。 查证只花了约 40 分钟——因为只需要锁定两个数, 而不是满网给每个数字找出处。

这一期新加的一条硬规矩

做分镜时我画了两根高度比约 1 ∶ 0.66 的柱子, 但旁白说的是「395 天换算成 1186 个工作日」——那个比例完全是我自己编的。

柱状图会被观众直接读成数字对比,所以这是一次隐性的数据造假, 哪怕本意只是「画个示意图」。修法是换成不表意的图形: 用「三个格子点亮第一个」表示排第一,用圆环表示换算。

规矩定下来:需要真实比例的图形,必须在分镜注释里写出处,否则不许用。

这一期新踩的坑

成品自带了 43 秒黑尾,而进度条上完全看不出来

剪映导出的成品标称 163 秒,但用 blackdetect 一测, 120.5 秒之后全是黑屏——音乐轨比画面轨长,导出时按最长轨补了黑。

人眼拖进度条是发现不了的,因为轨道看起来是满的。 现在的交片流程固定加两步:跑一次黑段检测、再用 ffprobe 核对时长, 时长对不上就是有问题。

开头 0.55 秒是黑的

画面时间轴跟着配音走,而配音留了 0.55 秒气口, 结果第一帧全黑,钩子那句字到 1.2 秒才出来——正好把最贵的 3 秒浪费掉了。

修法:第一屏强制从 0 秒开始,让字先于人声出现,配音的气口保留。 下一条还要继续改:首屏入场动画现在仍留了约 0.03 秒偏黑, 要改成第一帧就满亮度。

拼图脚本悄悄不出图

抽帧脚本里多加了一个 fps 滤镜,导致拼接图片数不够, ffmpeg 返回成功码却根本没写文件——验收环节差点被跳过。

规矩:拼静态图时不要加帧率滤镜;脚本里 ffmpeg 一律带 -y, 并且必须检查输出文件真的存在,不能只看返回码。

验收:54 屏拼图过一遍

每屏抽中间帧拼成大图,一眼就能看出哪屏空、哪屏挤。

《机会成本》54 屏分镜总览
54 屏全览。这一期一共渲了 4 遍,每遍都是先看这张拼图找出毛病再改。

三步:拼图扫全片节奏 → 可疑的屏单独看全分辨率 → 逐屏量响度。

这一期花在验收上约 25 分钟。和上一期同一个结论: 零成本省下的是钱,省不下的是「看画面找毛病」这一环—— 拼图脚本和逐屏抽帧是必备工序,不能省。

这一期花了多少时间

步骤耗时说明
查证数字约 40 分钟只锁定一份报告的 2 个数,其余靠四则运算
写旁白 35 句约 25 分钟按 5.9 汉字/秒反推,写完就知道大概多长
TTS + 量时长约 6 分钟35 段串行合成,去尾静音后排轴
写 @vibe/pop约 2 小时本期最大成本;一次开发,以后每期只管填分镜表
写 54 屏分镜约 70 分钟每屏就是一条元组,改起来快
渲染每次约 6 分钟一共渲了 4 遍,每遍先看拼图再改
验收约 25 分钟54 屏拼图 + 关键屏全分辨率 + 量响度

钱不是问题——全程零积分、零 API、零外部服务, TTS 用系统自带、画面本地渲染 3615 帧约 6 分钟。 成本全在时间和注意力上,尤其是在「看画面找毛病」这一环。

下一条要做的

  • 火柴人只有 9 种姿势,缺「跑」「递东西」「低头看手机」—— 补 3 个姿势很便宜,但表达力会明显上去。
  • 首屏还差最后一点:整屏淡入留了约 0.03 秒偏黑, 改成第一帧就满亮度。
  • 第一期的 13 张 AI 静帧位依然没接。 @vibe/pop 目前是纯代码绘制,可以试一版「黑金底 + 2~3 张彩色插屏」, 但要算清楚每张插屏的积分成本——毕竟走本地路线的初衷就是不想依赖它。
  • 需要真实比例的图形,强制在分镜注释里写出处,否则不许用。

说明

画面与配音由本地代码和系统 TTS 生成,配乐在剪映人工完成。 全片只引用一份公开报告里的两个数字,其余数字均由它们推导而来, 不含任何推测值或示意性比例。