Communitygithub.com

竖屏短视频

当用户要求制作一条 9:16 竖屏短视频时,应使用此技能。它专注于通过钩子、模式中断和循环设计来最大限度地提高观众留存率。

竖屏短视频 是什么?

此技能用于工程化一条能够经受住滑动考验的 9:16 竖屏短视频。它将短视频定义为一种“留存机器”,而非小型宣传片,其核心目标是通过在开头 1-3 秒内创建“钩子”来获取第一秒的观看,通过每隔几秒的“模式中断”来重置观众注意力,并经常使用“无缝循环”技巧来促使观看时间超过 100%。技能详细阐述了“留存率”是驱动算法的唯一指标,高于制作价值,并提供了基于帧驱动的剪辑方法来优化留存曲线。该技能主要针对 Remotion 框架,要求所有动画基于 `useCurrentFrame()` 实现,确保渲染确定性,并提供了从静态帧验证到最终 MP4 编码的完整交付检查清单。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/iart-ai/tiktok-video-skills/tree/main/skills/short-form-video

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

竖屏短视频 是做什么的?

工程化一条 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 以选择中间和最后一帧。

在完成之前:

  1. 静态帧在钩子、中间和最后一帧处干净渲染——无错误。
  2. 钩子帧即时可读(屏幕上文字 + 最强视觉元素在前,无淡入);第一帧与最后一帧匹配以实现干净的循环接缝。
  3. 钩子 + 主体 + 字幕在每个检查帧都位于 9:16 中心 900×1400 安全框内。
  4. 仅由帧驱动——无 Date.now() / Math.random() / 定时器;剪辑不均匀,中间无平坦。
  5. 使用真实主题的交付道具(非 defaultProps)正确渲染;MP4 编码,GIF 可选。

参考文件

  • references/retention-pacing.md — 一个完整可运行的 Remotion <Short> 组合:一个带有不均匀剪辑的帧驱动镜头调度器、PunchIn 模式中断、屏幕上钩子、一个 9:16 安全区域覆盖层以及一个无缝的首/末帧循环。还包括钩子模式库、留存率曲线调试方法、每个平台的安全区域映射以及模板×主题批量渲染模式。

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

相关技能