竖屏短视频 是做什么的?
工程化一条 9:16 的、能经受住滑动考验的视频。短视频不是一部小型宣传片——它是一台留存机器:一个在第一秒赢得注意力的钩子,每隔几秒重置注意力的模式中断,以及通常一个能购买超过 100% 观看时间的循环。其技巧在于时机,而非精致。
何时使用
- Reels / TikTok / YouTube Shorts(7-60秒,9:16 竖屏)。
- 留存率剪辑:修复流失点,添加模式中断,收紧节奏。
- 钩子、无缝循环、可复用的竖屏模板(一种设计,多个主题)。
故事结构(留存契约)
短视频叙事是与观众拇指的一份契约:每一秒都必须重新赢得下一秒。叙事是从留存曲线反向塑造的,而不是从介绍正向推进。在接触时间线之前,请锁定这些点。
- 一个视频一个想法。 一个短视频只承载一个回报。第二个想法会分散注意力,导致曲线在中段下沉——把它做成第二个视频。如果你不能用一句话说出核心收获,那你还没有一个短视频。
- 在前 ~3 秒打开一个循环,最后关闭它。 钩子提出一个问题或空白(开放循环);回报给出答案。观众留下是因为循环是开放的——所以永远不要过早回答它,也永远不要把回报埋在铺垫之下。
- 没有冷场。 每个节拍要么推进想法,要么重置注意力。剪掉任何两者都不做的内容。静默、缓慢的推进、清嗓子的开场(“嘿大家,在这个视频中……”)是观众滑动离开的地方。
- 为什么曲线(而非剪辑)是工作单元。 算法会分发任何能保持每秒留存率曲线平坦的内容;一个“好的”但让曲线变平的剪辑,输给一个能保持曲线上升的丑陋剪辑。你是在编辑曲线,而钩子决定了其后的一切——先修复它。
叙事主线(下表预算是 钩子 → 铺垫 → 主体 → 回报/循环 的弧线):
| 阶段 | 故事职责 | 如果失败的结果 |
|---|---|---|
| 钩子 | 打开循环;承诺回报 | 前 3 秒被滑走 |
| 紧张保持 | 在主体部分保持间隙开放 | 中间平坦,中途流失 |
| 回报 | 关闭循环——交付那一个想法 | “浪费我时间”,不分享 |
| 循环 / 行动号召 | 反馈回第 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 种方法” | 教育 / 列表类 |
| 模式中断 | 快拉变焦 / 甩镜头 / 第 1 帧的视觉不匹配 | 娱乐 |
| 否定 | “停止做 ___” / “你 ___ 错了” | 强烈观点 |
两条规则:钩子行在第 1 帧就以文字形式出现在屏幕上(85% 的观众静音观看),而最引人注目的视觉元素也应该是第一帧——永远不要有缓慢的淡入。保持一个强劲的起始帧;不要从黑场淡入。
模式中断与剪辑节奏
模式中断是指任何能重置注意力的变化:硬切、缩放冲击、B-roll 插入、音效、字幕弹出或角度变化。在竖屏短视频中,密度很高——每 约 2-4 秒一个视觉变化;大约每 4 秒有一个中断的视频,其留存率约为 58%,而静态讲话头约为 41%。致命点是中间平坦:当完播曲线变平时,TikTok 会限制分发,所以永远不要用低能量的片段拼接主体。
// 每次中断都由 FRAME 驱动,而不是挂钟时间——确保确定性渲染。
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 空白 | 个人资料 / 声音界面 |
| 底部 | 保持约 320px 空白 | 字幕、行动号召、标签、音频栏 |
| 右侧 | 保持约 120px 空白 | 点赞 / 评论 / 分享侧栏 |
将钩子文字和关键主体放在中心 900×1400 框内。即使它在编辑器中看起来很空,也要保留底部约 320px——那是平台绘制其自己的字幕和按钮的地方。
输出检查清单
- 钩子行在第 1 帧就以屏幕上文字形式出现;最强视觉元素是第一帧(无淡入)。
- 在前约 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%(字幕/行动号召/音频),右侧操作栏
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 安全区域覆盖层以及一个无缝的首/末帧循环。还包括钩子模式库、留存率曲线调试方法、每个平台的安全区域映射以及模板×主题批量渲染模式。