product-launch-video
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseProduct Launch Video Workflow
产品发布视频制作工作流
A repeatable workflow for producing 15-30s product launch videos using Remotion. Built for feature launches, app demos, and before/after transformations destined for X, LinkedIn, YouTube Shorts, and landing pages.
一套可复用的工作流,使用Remotion制作15-30秒的产品发布视频,适用于功能上线、应用演示以及前后效果对比类视频,可发布至X(原Twitter)、LinkedIn、YouTube Shorts及落地页。
When to use
适用场景
- Product launch needs a short, social-ready video
- New feature demo for X/LinkedIn
- Before/after product transformation clip
- Landing page hero video
- 产品发布需要制作适合社交平台的短视频
- 为X/LinkedIn制作新功能演示视频
- 产品前后效果对比短视频
- 落地页主视觉视频
Prerequisites
前置条件
- Node.js 18+
- This repo cloned and run
npm install - ffmpeg (only if exporting GIFs)
- A screen recording of the product (30-60s, used as design inspiration only)
- The launch copy: headline, tagline, key features, tone direction
- Node.js 18+
- 克隆本仓库并执行
npm install - ffmpeg(仅在导出GIF时需要)
- 产品的屏幕录制视频(30-60秒,仅用作设计参考)
- 发布文案:标题、副标题、核心功能、风格指引
Workflow
工作流
1. Gather inputs (parallel)
1. 收集输入(并行进行)
Pull these in parallel before writing anything:
- The brief — launch post, landing page, one-pager. Extract: headline, taglines, key features, tone.
- Brand tokens — fonts, colors, icons, logos. If you have a design system, surface its values. Otherwise, pull from the live product.
- Screen recording — a 30-60s recording of the product in real use. This is your design inspiration and a source of truth for actual UI copy. Never invent labels, agent names, or features that don't exist in the real app.
- Voice calibration (optional) — if the video has narration or you're ghostwriting captions in a specific voice, pull recent posts/clips to match cadence and word choice.
在开始制作前,并行收集以下内容:
- 需求简报 — 发布帖、落地页、单页文档。提取:标题、副标题、核心功能、风格调性。
- 品牌标识 — 字体、颜色、图标、Logo。若有设计系统,直接使用其规范;否则从现有产品中提取。
- 屏幕录制视频 — 30-60秒的产品实际使用录制视频。这是你的设计参考和真实UI文案的来源。切勿编造真实应用中不存在的标签、Agent名称或功能。
- 语气校准(可选) — 如果视频包含旁白或需要模仿特定语气撰写字幕,提取近期的帖子/视频以匹配节奏和用词风格。
2. Storyboard before any code
2. 先做分镜脚本再写代码
Write a shot-list table. Resist the urge to start coding.
| Beat | Time | Visual | Text overlay |
|---|
Rules that save you from re-rendering:
- Use real product UI copy. Screenshot the actual app and mirror what's there. Invented labels are the #1 reason launches feel fake.
- Lead with the viewer's problem (hook), not the product name.
- Product must appear within 3 seconds (a16z Speedrun research on launch videos).
- Before/after is the money shot — design the whole video around it.
- All text must be readable at 720p (phone feed). Minimum 18px equivalent.
- 85%+ of social views are muted — burn all captions in. No VO unless explicitly requested.
编写镜头列表表格。克制直接开始编码的冲动。
| 节拍 | 时间 | 视觉内容 | 文字叠加 |
|---|
避免重复渲染的规则:
- 使用真实产品UI文案。截图真实应用并完全照搬文案。编造标签是导致发布视频显得虚假的首要原因。
- 以用户的问题为开头(钩子),而非产品名称。
- 产品必须在3秒内出现(a16z关于发布视频的Speedrun研究结论)。
- 前后效果对比是核心镜头 — 围绕这个镜头设计整个视频。
- 所有文字在720p分辨率下必须清晰可读(手机端播放)。最小等效字号为18px。
- 85%以上的社交平台观看为静音状态 — 必须嵌入所有字幕。除非明确要求,否则不要添加旁白。
3. Build in Remotion
3. 在Remotion中构建
This repo ships with a minimal Remotion scaffold. Start from and customize:
src/LaunchVideo.tsx- Keep the composition thin — extract scenes, theme, fonts, and mock data into their own files as complexity grows
- Register new compositions in (one per aspect ratio if shipping to multiple platforms)
src/Root.tsx - Use for assets in
staticFile()public/ - Defaults are 1920×1080 at 30fps, h264 crf 18 — see the Ship section for platform-specific overrides
Font loading pattern (prevents character clipping and layout thrash):
tsx
const [handle] = useState(() => delayRender('fonts'));
useEffect(() => {
const font = new FontFace('Name', `url(${staticFile('fonts/file.otf')})`);
font.load().then(f => { document.fonts.add(f); continueRender(handle); });
}, [handle]);Crossfade transitions — handle at the orchestrator/root level, not per-scene. Per-scene exit fades fight the orchestrator and cause double-fading.
本仓库提供了一个极简的Remotion脚手架。从开始定制:
src/LaunchVideo.tsx- 保持组合结构简洁 — 随着复杂度增加,将场景、主题、字体和模拟数据提取到单独文件中
- 在中注册新的组合(如果要发布到多个平台,需为每个宽高比创建一个组合)
src/Root.tsx - 使用加载
staticFile()目录下的资源public/ - 默认设置为1920×1080分辨率、30fps、h264编码crf值18 — 请查看发布部分的平台特定配置
字体加载模式(避免字符截断和布局抖动):
tsx
const [handle] = useState(() => delayRender('fonts'));
useEffect(() => {
const font = new FontFace('Name', `url(${staticFile('fonts/file.otf')})`);
font.load().then(f => { document.fonts.add(f); continueRender(handle); });
}, [handle]);交叉淡入淡出过渡 — 在编排器/根级别处理,而非每个场景单独处理。场景级别的退出淡入会与编排器冲突,导致双重淡入效果。
4. Render-audit loop
4. 渲染-审核循环
bash
undefinedbash
undefinedSingle frame audit
单帧审核
npx remotion still <comp-id> out/test.png --frame 60
npx remotion still <comp-id> out/test.png --frame 60
Full render
完整渲染
npx remotion render <comp-id> out/video.mp4 --codec=h264 --crf=18
Render one frame per scene first. Fix layout/clipping issues before full render. Check:
- Text not clipped (line-height >= 1.2 for serif fonts with descenders)
- Panels not stacking unexpectedly (AbsoluteFill defaults to `flex-direction: column`)
- Content not truncated in bubbles, cards, or chat UInpx remotion render <comp-id> out/video.mp4 --codec=h264 --crf=18
先渲染每个场景的一帧。在完整渲染前修复布局/截断问题。检查:
- 文字未被截断(带下行字母的衬线字体行高≥1.2)
- 面板未意外堆叠(AbsoluteFill默认`flex-direction: column`)
- 气泡、卡片或聊天UI中的内容未被截断5. Multi-agent review (the step that catches everything)
5. 多Agent审核(排查所有问题的关键步骤)
After 2-3 self-iterations, render ~20 frames (peak moments + transition frames) to and spawn 4 review agents in parallel. Each reads the PNG frames and returns a prioritized fix list.
out/review/- Design/layout critic — off-kilter elements, misalignment, proportions, cropping
- Text/readability critic — legibility at 720p, contrast, truncation, typos
- Narrative/pacing critic — story arc, attention peaks/drops, earned duration, CTA strength
- Brand consistency critic — fonts, colors, UI chrome matching the real product
Compile all 4 critic outputs + your own notes into a single revision plan before the next render pass. This step finds things you stop seeing after 50 renders.
经过2-3次自我迭代后,渲染约20帧(关键时刻+过渡帧)到目录,并行启动4个审核Agent。每个Agent会读取PNG帧并返回优先级排序的修复列表。
out/review/- 设计/布局审核Agent — 检查偏移元素、对齐问题、比例、裁剪
- 文字/可读性审核Agent — 720p分辨率下的可读性、对比度、截断、拼写错误
- 叙事/节奏审核Agent — 故事弧线、注意力峰值/下降、时长合理性、CTA强度
- 品牌一致性审核Agent — 字体、颜色、UI框架与真实产品匹配度
将4个审核Agent的输出结果加上你自己的笔记整理成一份单一的修订计划,再进行下一轮渲染。这个步骤能发现你在多次渲染后忽略的问题。
6. Iterate on feedback
6. 根据反馈迭代
Watch the render in QuickTime (or your player of choice) and iterate. Common feedback patterns and their fixes:
- "This text is cut off" → line-height or overflow issue
- "This feels clunky" → animation timing too fast/slow; check counter digit-flicker rate
- "You invented this label" → replace with real UI copy from the screen recording
- "Hold longer here" → extend scene duration, keep animation timing the same
- "A little long overall" → cut redundant scenes (the narrative critic usually identifies which)
使用QuickTime(或你常用的播放器)观看渲染视频并迭代。常见反馈模式及修复方案:
- "这段文字被截断了" → 行高或溢出问题
- "感觉很生硬" → 动画节奏太快/太慢;检查数字跳动速率
- "你编造了这个标签" → 替换为屏幕录制视频中的真实UI文案
- "这里需要停留更长时间" → 延长场景时长,保持动画节奏不变
- "整体有点长" → 删除冗余场景(通常叙事审核Agent会指出哪些场景)
7. Ship for the right platform
7. 针对目标平台发布
Ask the user which platforms they're publishing to before rendering. Aspect ratio and duration limits differ — a 16:9 clip cropped to 9:16 in post usually looks bad. If the video is going to multiple platforms with different aspect ratios, create a separate Remotion composition for each and render independently.
This repo defaults to 1920×1080 landscape. Change dimensions in to fit the target platform:
src/Root.tsx| Platform | Aspect | Recommended size | Max duration |
|---|---|---|---|
| X / Twitter (feed) | 16:9 | 1920×1080 | 2:20 |
| X / Twitter (vertical) | 9:16 | 1080×1920 | 2:20 |
| LinkedIn (feed, landscape) | 16:9 | 1920×1080 | 10 min |
| LinkedIn (feed, square) | 1:1 | 1200×1200 | 10 min |
| YouTube (standard) | 16:9 | 1920×1080 | — |
| YouTube Shorts | 9:16 | 1080×1920 | 60s |
| Instagram Feed | 4:5 | 1080×1350 | 60s |
| Instagram Reels | 9:16 | 1080×1920 | 90s |
| TikTok | 9:16 | 1080×1920 | 3 min |
Recommended deliverable pack:
- MP4 in each requested aspect ratio
- GIF version for embeds and Slack shares (see Render commands below)
- Caption variants for each platform (length and tone differ)
- A thread/feature-list version for X and LinkedIn replies
在渲染前询问用户要发布到哪些平台。不同平台的宽高比和时长限制不同 — 后期将16:9的视频裁剪为9:16通常效果很差。如果要发布到多个宽高比不同的平台,为每个平台创建单独的Remotion组合并独立渲染。
本仓库默认设置为1920×1080横屏。在中修改尺寸以适配目标平台:
src/Root.tsx| 平台 | 宽高比 | 推荐尺寸 | 最大时长 |
|---|---|---|---|
| X / Twitter(信息流) | 16:9 | 1920×1080 | 2分20秒 |
| X / Twitter(竖屏) | 9:16 | 1080×1920 | 2分20秒 |
| LinkedIn(信息流,横屏) | 16:9 | 1920×1080 | 10分钟 |
| LinkedIn(信息流,方形) | 1:1 | 1200×1200 | 10分钟 |
| YouTube(标准) | 16:9 | 1920×1080 | — |
| YouTube Shorts | 9:16 | 1080×1920 | 60秒 |
| Instagram Feed | 4:5 | 1080×1350 | 60秒 |
| Instagram Reels | 9:16 | 1080×1920 | 90秒 |
| TikTok | 9:16 | 1080×1920 | 3分钟 |
推荐交付包:
- 每个请求宽高比的MP4文件
- 用于嵌入和Slack分享的GIF版本(请查看下方渲染命令)
- 针对每个平台的字幕变体(长度和语气不同)
- 适用于X和LinkedIn回复的线程/功能列表版本
Hard-won lessons
经验总结
- Never invent product UI labels. Screenshot the real app and mirror the copy exactly. This is the single biggest source of launch video cringe.
- Find the one moment only your product can deliver — give it the most screen time. Every launch video has a differentiating beat. The rest of the video should set it up. Don't spread the runtime evenly across features.
- Before/after stagger beats simultaneous. Land the "before" first for 0.7-1s, then crash in the "after" with a spring overshoot and a color flash. Much more dramatic than both appearing together.
- Counter animations: match per-frame digit rate to whatever feels natural. A bigger target number shouldn't fit in the same animation window — stretch it.
- Endcard: one headline + CTA. Don't stack 3 lines of copy. Use the landing page's actual tagline — not something you invented to sound punchier.
- Ground your "problem state" in something viewers recognize without explanation. If they need a sentence to understand what's wrong, the hook is too abstract.
- 切勿编造产品UI标签。截图真实应用并完全照搬文案。这是导致发布视频尴尬的最大原因。
- 找到只有你的产品能实现的核心时刻 — 给它最多的屏幕时间。每个发布视频都有一个差异化的核心节拍。视频的其余部分都应为其铺垫。不要将时长平均分配给所有功能。
- 前后效果对比采用错开呈现而非同时出现。先展示“之前”状态0.7-1秒,然后用弹性过冲和颜色闪烁效果切入“之后”状态。比同时出现效果更震撼。
- 数字动画: 匹配每帧数字变化速率使其自然。目标数字越大,动画时长应越长,不要局限于固定的动画窗口。
- 片尾卡片:一个标题+CTA。不要堆叠3行文案。使用落地页的真实副标题 — 不要为了显得更有冲击力而编造内容。
- 将“问题状态”建立在用户无需解释就能理解的场景上。如果用户需要一句话才能理解问题所在,那么钩子太抽象了。
Render commands
渲染命令
bash
undefinedbash
undefinedPreview in browser (hot-reload studio)
在浏览器中预览(热重载工作室)
npm run studio
npm run studio
Single frame (fastest way to audit)
单帧(最快的审核方式)
npx remotion still <comp-id> out/frame.png --frame 60
npx remotion still <comp-id> out/frame.png --frame 60
Full video
完整视频
npx remotion render <comp-id> out/video.mp4 --codec=h264 --crf=18
npx remotion render <comp-id> out/video.mp4 --codec=h264 --crf=18
GIF (for embeds — requires ffmpeg)
GIF(用于嵌入 — 需要ffmpeg)
ffmpeg -y -i out/video.mp4
-vf "fps=15,scale=960:-1:flags=lanczos,split[s0][s1];[s0]palettegen=max_colors=128[p];[s1][p]paletteuse=dither=bayer:bayer_scale=3"
out/video.gif
-vf "fps=15,scale=960:-1:flags=lanczos,split[s0][s1];[s0]palettegen=max_colors=128[p];[s1][p]paletteuse=dither=bayer:bayer_scale=3"
out/video.gif
undefinedffmpeg -y -i out/video.mp4
-vf "fps=15,scale=960:-1:flags=lanczos,split[s0][s1];[s0]palettegen=max_colors=128[p];[s1][p]paletteuse=dither=bayer:bayer_scale=3"
out/video.gif
-vf "fps=15,scale=960:-1:flags=lanczos,split[s0][s1];[s0]palettegen=max_colors=128[p];[s1][p]paletteuse=dither=bayer:bayer_scale=3"
out/video.gif
undefined