《机会成本》:把上一期提的四条改进,全部落地
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 屏拼图过一遍
每屏抽中间帧拼成大图,一眼就能看出哪屏空、哪屏挤。
三步:拼图扫全片节奏 → 可疑的屏单独看全分辨率 → 逐屏量响度。
这一期花在验收上约 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 生成,配乐在剪映人工完成。 全片只引用一份公开报告里的两个数字,其余数字均由它们推导而来, 不含任何推测值或示意性比例。