短视频
打造一条能挺过滑走的9:16视频。短视频并非微缩版宣发片——它是留存机器:钩子赢得第一秒,模式中断每隔几秒重置注意力,循环常能买到超过100%的观看时间。关键在于时机,而非精细度。
何时使用
- Reels / TikTok / YouTube Shorts(7–60秒,竖屏9:16)。
- 留存编辑:修复流失点、增加模式中断、收紧节奏。
- 钩子、无缝循环、可复用的短视模板(一种设计,多个主题)。
故事结构(留存契约)
短视频叙事是与观众拇指的契约:每一秒都必须重新赢得下一秒。故事是从留存曲线逆向塑造的,而不是从开头正向展开。在触碰时间线前必须锁定这些要点。
- 每视频一个想法。 一个短视频只携带一个回报点。第二个想法会分散注意力,曲线中部会塌陷——不如做成第二个视频。如果你不能用一句话说清单个主旨,那你还没有写出一个短视频。
- 在前~3秒内打开一个循环,最后闭合它。 钩子提出一个问题或缺口(开放循环);回报给出答案。观众留下因为循环是开放的——所以永远不要过早回答,也永远不要把回报埋在铺垫之下。
- 没有死气沉沉的时段。 每个节拍要么推进想法,要么重置注意力。任何做不到这两点的内容都该剪掉。沉默、慢速斜坡、开场白("嘿大家好,在这个视频里……")都是观众滑走的地方。
- 为什么曲线,而非剪辑,才是工作单元。 算法分发任何能保持每秒留存曲线平坦的内容;一个“好看”但曲线下降的剪辑,会输给一个丑陋但能维持曲线的剪辑。你是在剪辑曲线,而钩子决定了之后的一切——先修好它。
叙事主干(钩子 → 铺垫 → 主体 → 回报/循环 的编排如下表所示):
| 阶段 | 叙事任务 | 失败后果 |
|---|---|---|
| 钩子 | 打开循环;承诺回报 | 前3秒内被滑走 |
| 张力保持 | 通过主体保持缺口开放 | 中部平坦,中途流失 |
| 回报 | 闭合循环——交付那个单一想法 | “浪费我时间”,无人分享 |
| 循环 / CTA | 反馈回第0帧,或一个明确要求 | 无重播,无行动 |
(留存曲线 下表中为每个阶段分配时间;本节是其叙事逻辑和顺序。钩子语法 列出了钩子原型。)
驱动一切的核心指标
留存,而非制作价值。 算法分发能留住观众的内容;约87%的观众在3秒内决定是否滑走,分发阈值约为70%+平均观看完成率(Shorts ~73%,TikTok ~78%,Reels ~65%)。下面的每个决策都围绕这条曲线进行权衡。一个完美镜头如果在0:04处令人乏味,输给一个丑陋但能留人的镜头。
留存曲线
| 节拍 | 任务 | 预算(20秒短视频) |
|---|---|---|
| 钩子(0–1秒) | 一帧画面+一句旁白,制造开放循环 | 0–1秒 |
| 铺垫 | 兑现为何观看——承诺、利害关系或缺口 | 1–4秒 |
| 主体 | 以节拍交付价值;每个节拍一个想法 | 4–17秒 |
| 回报 / 循环 | 闭合循环——或将其反馈回第0帧 | 17–20秒 |
只扩展主体,绝不扩展钩子。一个60秒的短视频有更长的主体和更多节拍——但钩子仍然是那1秒。
钩子语法(前~1秒)
钩子是一个句子+一个画面,在大脑中打开一个需要闭合的好奇缺口。选择一个模式并坚持:
| 钩子类型 | 形态 | 最适合 |
|---|---|---|
| 开放循环 | “你的X一直Y的原因……”(答案延后) | 大多数内容 |
| 直接承诺 | “30秒内学会___的3种方法” | 教育 / 列表类 |
| 模式中断 | 快照缩放 / 甩镜 / 第一帧视觉不匹配 | 娱乐 |
| 否定式 | “别再______” / “你______错了” | 强烈观点 |
两条规则:钩子台词必须在第一帧就作为屏幕文字出现(85%的观看是静音的),且最引人注目的视觉也必须是第一帧——绝不要慢速入场。保持一个强有力的开场帧;不要从黑色淡入。
模式中断与剪切节奏
模式中断是指任何能重置注意力的变化:硬切、缩放推镜、B-roll插入、音效、字幕弹出或角度变化。在短视中,密度很高——每~2–4秒一个视觉变化;约每4秒一个中断的视频留存率约58%,而静态讲话头则约41%。致命问题是中部平坦:TikTok会在观看曲线变平后限制分发,所以绝不能将低能量的镜头拼接成主体。
// 所有中断基于帧驱动,而非挂钟时间——确保确定性渲染。
import { useCurrentFrame } from "remotion";
const fps = 30;
const cuts = [0, 1.2, 3.0, 5.4, 8.0, 11.2, 14.0]; // 秒——故意不均匀
const frame = useCurrentFrame();
const shot = cuts.findIndex((t, i) => frame < (cuts[i + 1] ?? Infinity) * fps);
变化间隔——节拍器会显得无聊;不均匀的剪接则显得有动感。推镜缩放是最廉价的中断,无需新素材:
import { useCurrentFrame, interpolate, spring, useVideoConfig } from "remotion";
const PunchIn = ({ at, children }) => {
const frame = useCurrentFrame(); const { fps } = useVideoConfig();
const s = spring({ frame: frame - at * fps, fps, config: { damping: 12, stiffness: 200 } });
const scale = interpolate(s, [0, 1], [1, 1.12]); // 在节拍上缩放到112%
return <div style={{ transform: `scale(${scale})`, transformOrigin: "50% 45%" }}>{children}</div>;
};
字幕
大多数观众静音观看,因此屏幕上的字幕不是可选项——它们承载内容,并在每个短语弹出时作为模式中断。每行保持4–7个单词,高对比度,位于安全区内。请勿在此重新实现字幕动画——使用caption-animation技能进行逐词计时、卡拉OK高亮和样式设置;本技能仅在留存时间线和9:16安全区内放置字幕。
循环与重播
无缝循环将每次重播计为新鲜观看时间——一个干净的8秒循环被观看3次,就是300%的观看完成率,这是最强的信号。两种技巧:使最后一帧与第一帧匹配(相同的构图、位置、颜色),使剪切不可见;并写一个句子循环——将钩子措辞得让回报反馈回第0帧("……这就是为什么我从不——" → 循环回到开头)。最佳重播长度约为7–15秒。
9:16安全区
在通用安全区内构图,确保平台UI不会覆盖文字或人脸。
| 区域 | 像素(1080×1920) | 避免 |
|---|---|---|
| 通用安全(所有平台) | 中心 900×1400 | 任何关键元素放在其外 |
| 顶部 | 保持~120px清空 | 头像 / 声音UI |
| 底部 | 保持~320px清空 | 字幕、CTA、标签、音频条 |
| 右侧 | 保持~120px清空 | 点赞 / 评论 / 分享按钮 |
将钩子文字和关键主体放在中心900×1400方框内。即便在编辑器中看起来空,也要预留底部约320px——那里是平台绘制自己的字幕和按钮的地方。
输出检查清单
- 钩子台词在第一帧就作为屏幕文字出现;最强视觉是第一帧(无淡入)。
- 在前~4秒内设置了一个开放循环/承诺。
- 每~2–4秒有一个视觉模式中断;间隔不均匀;中部平坦。
- 字幕已添加(通过
caption-animation),每行4–7个单词,位于安全区内。 - 循环已闭合——首尾帧匹配或句子反馈回第0帧。
- 在中心900×1400方框内构图;底部320px / 顶部120px / 右侧120px保持清空。
- 所有动画值均使用
useCurrentFrame()派生——无CSS/库计时器。
交付与验证(渲染静帧 → MP4)
打包助手(
scripts/):使用scripts/contact-sheet.sh sheet.png f-hook.png f-mid.png f-end.png拼接静帧,然后用scripts/probe-mp4.sh out.mp4 [宽x高] [fps]检查编码。详见scripts/README.md。
短视频以Remotion组合形式交付(<Composition> + zod schema + defaultProps)——所有剪切、推镜和中断都由useCurrentFrame()驱动,绝不能使用Date.now() / Math.random() / 定时器。交付物 = out/*.mp4 + 项目(每个主题重新渲染)。默认9:16竖屏(1080×1920)。
验证循环 — 渲染静帧 → 检查 → 编码。 三帧检查决定留存的三件事:钩子、节奏和循环接缝。
# 钩子 / 主体中部 / 最后一帧的静帧 — 使用实际主题属性(非默认值)
npx remotion still Short out/f-hook.png --frame=10 --props='{"topic":"...","hook":"..."}' # ~前3秒可立即阅读
npx remotion still Short out/f-mid.png --frame=N --props='{"topic":"...","hook":"..."}'
npx remotion still Short out/f-end.png --frame=L --props='{"topic":"...","hook":"..."}' # L = durationInFrames-1
# 检查每个PNG:
# - 钩子帧(~第0帧左右/前3秒):钩子台词是屏幕文字且可立即阅读;最强视觉已存在(无淡入)
# - 循环接缝:比较f-hook(帧0)与f-end(最后一帧)—— 首尾构图、位置、颜色匹配,实现不可见的循环剪切
# - 9:16安全区:钩子+关键主体位于中心900x1400方框内;远离顶部约12%、底部约20-35%(字幕/CTA/音频)、右侧操作栏
npx remotion render Short out/short.mp4 --props='{"topic":"...","hook":"..."}' # 静帧验证通过后再编码
npx remotion render Short out/demo.gif --codec=gif # README演示片段
每个主题 / 批次: 在渲染所有主题之前,先通过静帧验证一个主题。使用 npx remotion compositions 获取 durationInFrames/fps 来挑选中部和末尾帧。
完成前检查:
- 在钩子、中部和最后一帧的静帧渲染无错误。
- 钩子帧可立即阅读(屏幕文字 + 最强视觉在最前方,无淡入);首帧与末帧匹配以实现干净循环接缝。
- 在检查的每一帧中,钩子 + 主体 + 字幕都位于9:16中心900×1400安全区内。
- 仅基于帧驱动——无
Date.now()/Math.random()/ 定时器;剪接不均匀,无平坦中部。 - 实际主题的已提交属性(非
defaultProps)能正确渲染;MP4已编码,GIF可选。
参考文件
references/retention-pacing.md— 一个完整可运行的Remotion<Short>组合:基于帧的镜头调度器,包含不均匀剪切、PunchIn模式中断、屏幕上钩子、9:16安全区叠加、以及无缝的首尾帧循环。此外还有钩子模式库、留存曲线调试方法、各平台安全区映射图、以及模板×主题批量渲染模式。