Communitygithub.com

Kreesten-hsh/video

垂直短视频创作技能,适用于抖音/TikTok/Shorts等平台,提供钩子、留存编辑、模式中断和循环设计的专业指导。

video 是什么?

本技能专注于9:16垂直短视频的工程化创作,涵盖Reels、TikTok、YouTube Shorts等平台。其核心理念是“留存驱动”——每个视频都是一个留存机器,通过钩子(Hook)在最初3秒内抓住观众,利用模式中断(Pattern Interrupt)每2-4秒重置注意力,并通过无缝循环(Loop)使观看时长突破100%。技能文档详细定义了叙事结构(钩子→张力保持→回报→循环/CTA)、留存曲线预算表、钩子语法(开放循环、直接承诺、模式中断、否定式)、剪切节奏(基于帧而非时钟的切割调度算法)以及9:16安全区。所有动画和切割均需基于Remotion的`useCurrentFrame()`驱动,确保确定性渲染。输出的检查清单包括:首帧即展示钩子文本和最强视觉、每2-4秒视觉变化且间隔不均匀、字幕位于安全区内、首尾帧无缝匹配。该技能与`caption-animation`等技能配合使用,并提供了验证步骤(渲染静帧检查钩子、中部、末尾帧)和批量渲染模式。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Kreesten-hsh/video/tree/HEAD/.agents/skills/short-form-video

在你喜欢的 AI 中提问

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

文档

短视频

打造一条能挺过滑走的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 来挑选中部和末尾帧。

完成前检查:

  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.

相关技能