ad-creative-video
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseAd Creative Video
广告创意视频
Build ONE motion-graphics ad template, then mass-produce variants from a data table — different hooks, offers, CTAs, and products — so a performance marketer can A/B test dozens of versions across placements and aspect ratios. The craft is making the template fully data-driven and message-matched, so 40 variants stay on-brand and only the tested variable changes.
制作一个动态图形广告模板,然后通过数据表批量生成变体——包含不同的钩子、优惠信息、CTA和产品——这样效果营销人员就可以在不同投放位置和宽高比下对数十个版本进行A/B测试。关键在于让模板完全实现数据驱动和消息匹配,确保所有变体都符合品牌调性,且仅测试变量发生变化。
When to use
适用场景
- Performance/UGC-style video ads where the first 1.5–3s must stop the scroll.
- Batch variant generation: one template rendered against many rows (headline/offer/CTA/product swaps) for A/B testing.
- Multi-aspect export of the same ad for Meta Feed, Reels/Stories, TikTok, YouTube.
Not for sale/discount countdown promos, and not for testimonial/review-driven ads — those are different structures. Stay on the batch-variation, test-everything angle.
- 效果类/UGC风格视频广告:前1.5–3秒必须抓住用户注意力,阻止其滑动屏幕。
- 批量生成变体:基于一个模板,结合多行数据(替换标题/优惠/CTA/产品)生成变体,用于A/B测试。
- 同一广告多宽高比导出:适配Meta Feed、Reels/Stories、TikTok、YouTube等平台。
不适用于促销倒计时类广告,也不适用于 testimonial/review(证言/评论)驱动的广告——这些属于不同的结构类型。请聚焦于批量变体、全面测试的方向。
The two rules that make variants worth running
让变体测试有效的两条规则
- Isolate one variable per variant. A test only teaches something if exactly one thing changes. Hold layout, motion, colors, and timing constant; swap only the field under test (hook, or offer, or CTA). Mixing two changes makes the winner uninterpretable.
- Message-match the hook to the CTA. The promise made in the first 3 seconds must be the promise the button pays off. A "stop wasting 2 hours a day" hook ends on "Save 2 hours — try free," not a generic "Shop now." The hook and CTA are a matched pair in every row of the data table.
- 每个变体仅隔离一个变量。只有当完全只有一个元素变化时,测试才能得出有效结论。保持布局、动效、颜色和时长不变;仅替换测试字段(钩子、优惠或CTA)。同时改变两个元素会导致无法判断获胜变体的关键因素。
- 钩子与CTA消息匹配。前3秒钩子做出的承诺,必须与CTA按钮兑现的承诺一致。例如,以「别再每天浪费2小时」为钩子的广告,结尾应该是「节省2小时——免费试用」,而非通用的「立即购买」。在数据表的每一行中,钩子和CTA都是匹配的一对。
Ad anatomy (15–30s)
广告结构(15–30秒)
| Beat | Job | Budget |
|---|---|---|
| Hook (0–3s) | Stop the scroll; state the problem or pattern-interrupt | 0–3s |
| Context | Make the viewer feel the problem / agitate | 3–8s |
| Payoff | Show the product as the solution, one clear benefit | 8–18s |
| Proof | One concrete number, demo, or result | 18–25s |
| CTA (last 3s) | Single action, message-matched to the hook | hold ≥2s |
Land the hook's emotional trigger before the 2-second mark — judgment forms in ~1.7s and scroll speed keeps rising. Test the hook FIRST; it moves CPA more than any other element.
| 节拍 | 作用 | 时长 |
|---|---|---|
| 钩子(0–3秒) | 抓住用户注意力;提出问题或打破常规 | 0–3秒 |
| 背景铺垫 | 让用户感知到问题 / 强化痛点 | 3–8秒 |
| 收益展示 | 将产品作为解决方案,展示一个清晰的核心优势 | 8–18秒 |
| 证明 | 一个具体的数据、演示或成果 | 18–25秒 |
| CTA(最后3秒) | 单一行动指令,与钩子消息匹配 | 保持≥2秒 |
务必在2秒前传递钩子的情感触发点——用户约1.7秒内就会形成判断,且滑动速度持续加快。优先测试钩子;它对CPA(单次转化成本)的影响超过其他任何元素。
Hook taxonomy (the field you vary most)
钩子分类(最常测试的字段)
| Hook type | Template | When it wins |
|---|---|---|
| Problem-first | "I didn't realize how much X was costing me until…" | pain is felt but unnamed |
| Pattern interrupt | "This is going to sound controversial, but…" | crowded feed, generic category |
| Curiosity gap | "Nobody talks about the one thing that…" | educated, skeptical audience |
| Immediate benefit | "Cut your X in half in 7 days" | clear, quantifiable outcome |
| Direct callout | "If you do X every morning, stop." | sharp audience segment |
Keep a column of 5–10 hook strings and let the batch render produce one ad per hook against the same body — that is the cleanest hook test possible.
| 钩子类型 | 模板句式 | 适用场景 |
|---|---|---|
| 痛点先行 | "直到……我才意识到X让我付出了多大代价" | 用户感受到痛点但未明确说出 |
| 打破常规 | "这听起来可能有点争议,但……" | 广告密集、品类同质化严重的信息流 |
| 好奇心缺口 | "没人谈论那件……的事" | 受众有认知、持怀疑态度 |
| 即时收益 | "7天内将你的X减半" | 结果清晰可量化 |
| 直接喊话 | "如果你每天早上都做X,别再做了。" | 精准细分受众 |
准备一列包含5–10个钩子文案,让批量渲染针对同一广告主体生成每个钩子对应的广告——这是最纯粹的钩子测试方式。
Data-driven template (everything is a prop)
数据驱动模板(所有元素均为属性)
Hardcode nothing the marketer might A/B test. The composition reads a single object; the renderer never edits the component. Make every animated value a pure function of so each frame renders deterministically (no CSS transitions, no library timers — they desync the render).
variantuseCurrentFrame()tsx
import {useCurrentFrame, interpolate, AbsoluteFill, useVideoConfig} from "remotion";
type Variant = {hook: string; benefit: string; proof: string; cta: string; bg: string; accent: string};
export const AdTemplate: React.FC<{v: Variant}> = ({v}) => {
const frame = useCurrentFrame(); const {fps} = useVideoConfig();
const hookIn = interpolate(frame, [0, 8], [40, 0], {extrapolateRight: "clamp"});
const ctaIn = interpolate(frame, [fps * 22, fps * 23], [0, 1], {extrapolateLeft: "clamp", extrapolateRight: "clamp"});
return (
<AbsoluteFill style={{background: v.bg, fontFamily: "Inter, sans-serif"}}>
<h1 style={{transform: `translateY(${hookIn}px)`, opacity: interpolate(frame,[0,8],[0,1])}}>{v.hook}</h1>
{frame > fps * 8 && <p>{v.benefit}</p>}
{frame > fps * 18 && <strong>{v.proof}</strong>}
<button style={{opacity: ctaIn, background: v.accent}}>{v.cta}</button>
</AbsoluteFill>
);
};See for the complete template, the CSV→props parser with validation, and the brand-lock theme object.
references/batch-ad-pipeline.md不要硬编码任何营销人员可能进行A/B测试的内容。合成内容读取单个对象;渲染器绝不编辑组件。将每个动画值设为的纯函数,确保每一帧的渲染都是确定性的(不要使用CSS过渡、库定时器——它们会导致渲染不同步)。
variantuseCurrentFrame()tsx
import {useCurrentFrame, interpolate, AbsoluteFill, useVideoConfig} from "remotion";
type Variant = {hook: string; benefit: string; proof: string; cta: string; bg: string; accent: string};
export const AdTemplate: React.FC<{v: Variant}> = ({v}) => {
const frame = useCurrentFrame(); const {fps} = useVideoConfig();
const hookIn = interpolate(frame, [0, 8], [40, 0], {extrapolateRight: "clamp"});
const ctaIn = interpolate(frame, [fps * 22, fps * 23], [0, 1], {extrapolateLeft: "clamp", extrapolateRight: "clamp"});
return (
<AbsoluteFill style={{background: v.bg, fontFamily: "Inter, sans-serif"}}>
<h1 style={{transform: `translateY(${hookIn}px)`, opacity: interpolate(frame,[0,8],[0,1])}}>{v.hook}</h1>
{frame > fps * 8 && <p>{v.benefit}</p>}
{frame > fps * 18 && <strong>{v.proof}</strong>}
<button style={{opacity: ctaIn, background: v.accent}}>{v.cta}</button>
</AbsoluteFill>
);
};完整模板、带验证的CSV→属性解析器以及品牌锁定主题对象,请查看。
references/batch-ad-pipeline.md1 template × CSV = N variants
1个模板 × CSV = N个变体
The payoff: author the ad once, then let a CSV drive the matrix. Each row is one fully-formed, message-matched variant. Render once per row.
bash
undefined核心价值:只需制作一次广告,即可通过CSV驱动生成矩阵变体。每一行都是一个完整的、消息匹配的变体。针对每一行渲染一次。
bash
undefinedvariants.csv: id,hook,benefit,proof,cta,bg,accent → one MP4 per row
variants.csv: id,hook,benefit,proof,cta,bg,accent → 每行对应一个MP4
node csv-to-props.js variants.csv ./props # writes props/<id>.json per row
for f in props/*.json; do
id=$(basename "$f" .json)
npx remotion render AdTemplate "out/${id}.mp4" --props="$f"
done
To build a clean test matrix, hold every column constant and vary one: 5 hooks × 1 body = 5 ads (hook test); then take the winning hook × 3 CTAs (CTA test). `references/batch-ad-pipeline.md` has a matrix generator that expands variable lists into the CSV so combinatorial tests stay one-variable-at-a-time.node csv-to-props.js variants.csv ./props # 为每行生成props/<id>.json文件
for f in props/*.json; do
id=$(basename "$f" .json)
npx remotion render AdTemplate "out/${id}.mp4" --props="$f"
done
要构建清晰的测试矩阵,请保持所有列不变,仅改变一列:5个钩子 × 1个主体 = 5个广告(钩子测试);然后用获胜钩子 × 3个CTA(CTA测试)。`references/batch-ad-pipeline.md`包含一个矩阵生成器,可将变量列表扩展为CSV,确保组合测试始终保持「一次仅变一个变量」。Multi-aspect export
多宽高比导出
Each placement wants a native aspect. Compose against a center safe zone so one master reframes cleanly to all of them — don't letterbox, re-center.
| Aspect | Placements | Resolution | Keep-clear safe zone |
|---|---|---|---|
| 9:16 | Reels, Stories, TikTok In-Feed | 1080×1920 | top ~14%, bottom ~20–35% (UI/caption), sides ~6% |
| 4:5 | Meta Feed (best feed real estate) | 1080×1350 | center 90%; CTA out of bottom 10% |
| 1:1 | Feed, broad reach | 1080×1080 | center square survives every crop |
| 16:9 | YouTube, in-stream | 1920×1080 | center 90% |
Design the hook text, product, and CTA inside the 1:1 center square so they survive every crop. Drive aspect from a prop and render each per variant:
bash
for ar in 9x16 4x5 1x1; do
npx remotion render AdTemplate "out/${id}-${ar}.mp4" --props="props/${id}.json" \
--props-merge="{\"aspect\":\"${ar}\"}"
doneKeep critical content out of the 9:16 bottom third — that is where the platform stacks captions, the CTA button, and the username. has exact pixel safe zones and per-platform duration/format limits.
references/platform-specs.md每个投放位置都有原生宽高比。围绕中心安全区域进行创作,让一个主模板可以干净地适配所有宽高比——不要添加黑边,而是重新居中。
| 宽高比 | 适用平台 | 分辨率 | 安全区域(需避开) |
|---|---|---|---|
| 9:16 | Reels、Stories、TikTok信息流 | 1080×1920 | 顶部约14%,底部约20–35%(UI/字幕区),两侧约6% |
| 4:5 | Meta Feed(最佳信息流位置) | 1080×1350 | 中心90%区域;CTA需避开底部10% |
| 1:1 | 信息流、广泛触达 | 1080×1080 | 中心正方形区域可适配所有裁剪 |
| 16:9 | YouTube、流媒体广告 | 1920×1080 | 中心90%区域 |
将钩子文案、产品和CTA设计在1:1中心正方形内,确保它们在任何裁剪下都能保留。通过属性驱动宽高比,并针对每个变体渲染对应版本:
bash
for ar in 9x16 4x5 1x1; do
npx remotion render AdTemplate "out/${id}-${ar}.mp4" --props="props/${id}.json" \
--props-merge="{\"aspect\":\"${ar}\"}"
done务必将关键内容放在9:16比例的底部三分之一之外——该区域是平台放置字幕、CTA按钮和用户名的位置。包含精确的像素安全区域,以及各平台的时长/格式限制。
references/platform-specs.mdOutput checklist
输出检查清单
- One variable per variant; layout/motion/timing identical across a test.
- Hook lands its trigger before 2s; hook and CTA are message-matched in every row.
- Every animated value is a pure function of — no CSS/library timers.
useCurrentFrame() - Dataset is a prop; nothing testable is hardcoded; one template renders the whole CSV.
- Each variant exported 9:16 + 4:5 + 1:1 (+16:9 if needed), key content in the center square.
- Brand stays locked across all variants via a single theme object.
- 每个变体仅含一个变量;同一测试中的布局/动效/时长完全一致。
- 钩子在2秒前传递触发点;每一行的钩子与CTA都保持消息匹配。
- 每个动画值都是的纯函数——不使用CSS/库定时器。
useCurrentFrame() - 数据集作为属性传入;所有可测试内容均不硬编码;一个模板即可渲染整个CSV。
- 每个变体导出9:16 + 4:5 + 1:1(如需可加16:9)版本,关键内容位于中心正方形内。
- 通过单一主题对象确保所有变体品牌调性一致。
Deliver & verify (rendered stills → MP4)
交付与验证(渲染静帧 → MP4)
Packaged helper (): tile your stills withscripts/, then assert the encode withscripts/contact-sheet.sh sheet.png f-hook.png f-mid.png f-end.png. Seescripts/probe-mp4.sh out.mp4 [WxH] [fps].scripts/README.md
Output contract:
- A Remotion ad template registered as (+ zod
<Composition>+schema), every animated value frame-driven (no CSS transitions / library timers /defaultProps/Date.now()).Math.random() - Deliverable = the rendered per variant per aspect (plus the project + CSV, so the marketer re-renders on new rows).
out/*.mp4
Verify loop — render stills → inspect → encode. Cheap PNGs first, full encode only once they're clean. Render with the shipped props (the real row), not just .
defaultPropsbash
undefined打包工具():使用scripts/拼接静帧,然后用scripts/contact-sheet.sh sheet.png f-hook.png f-mid.png f-end.png验证编码。详情请查看scripts/probe-mp4.sh out.mp4 [WxH] [fps]。scripts/README.md
输出规范:
- 注册为的Remotion广告模板(含zod
<Composition>+schema),所有动画值均由帧驱动(不使用CSS过渡/库定时器/defaultProps/Date.now())。Math.random() - 交付物 = 每个变体对应每个宽高比的渲染文件(附带项目文件+CSV,方便营销人员新增行后重新渲染)。
out/*.mp4
验证流程——渲染静帧 → 检查 → 编码。 先渲染低成本PNG,确认无误后再进行完整编码。使用实际行属性(真实数据)渲染,而非仅用。
defaultPropsbash
undefinedFrame-exact stills across the hook→CTA arc, with a real variant's props
针对钩子→CTA流程渲染精确帧的静帧,使用真实变体属性
npx remotion still AdTemplate out/f-hook.png --frame=12 --props=props/v1.json # hook readable < 2s
npx remotion still AdTemplate out/f-mid.png --frame=300 --props=props/v1.json # benefit/proof
npx remotion still AdTemplate out/f-cta.png --frame=689 --props=props/v1.json # CTA, message-matched
npx remotion still AdTemplate out/f-hook.png --frame=12 --props=props/v1.json # 钩子在2秒内清晰可见
npx remotion still AdTemplate out/f-mid.png --frame=300 --props=props/v1.json # 展示收益/证明
npx remotion still AdTemplate out/f-cta.png --frame=689 --props=props/v1.json # CTA与钩子消息匹配
inspect each: fidelity (hook / offer / proof / CTA text exact, brand bg+accent right)
检查每一张静帧:准确性(钩子/优惠/证明/CTA文本准确,品牌背景+强调色正确)
AND artifacts (text overflow, off-canvas, CTA inside the 9:16 bottom third, missing font, wrong row binding)
以及是否存在问题(文本溢出、超出画布、CTA位于9:16底部三分之一内、字体缺失、行绑定错误)
**Multi-aspect / batch — verify one variant in EACH aspect before batch-rendering the matrix.** A layout bug repeats across every row × aspect; catch it once.
```bash
for ar in 9x16 4x5 1x1; do # one representative variant, every target aspect
npx remotion still AdTemplate "out/v1-${ar}.png" --frame=300 \
--props=props/v1.json --props-merge="{\"aspect\":\"${ar}\"}"
done
**多宽高比/批量验证——批量渲染矩阵前,先验证一个变体的所有宽高比版本。** 布局错误会在每一行×每个宽高比中重复出现;提前发现一次即可避免批量错误。
```bash
for ar in 9x16 4x5 1x1; do # 选取一个代表性变体,验证所有目标宽高比
npx remotion still AdTemplate "out/v1-${ar}.png" --frame=300 \
--props=props/v1.json --props-merge="{\"aspect\":\"${ar}\"}"
donestills clean in all aspects? → then batch-render every row × aspect:
所有宽高比的静帧均无问题?→ 然后批量渲染所有行×所有宽高比:
for f in props/*.json; do id=$(basename "$f" .json); for ar in 9x16 4x5 1x1; do
npx remotion render AdTemplate "out/${id}-${ar}.mp4" --props="$f" --props-merge="{"aspect":"${ar}"}"
done; done
npx remotion render AdTemplate out/demo.gif --codec=gif --props=props/v1.json # README demo
**Before you finish:**
1. `npx remotion still` renders cleanly at hook / mid / CTA — no errors, no missing fonts/assets.
2. Hook/offer/proof/CTA text exact and brand colors right; nothing in the 9:16 bottom third or outside the center safe zone.
3. Frame-driven only — no CSS/library timers, `Date.now()`, or `Math.random()`.
4. Shipped row's props render correctly (not just `defaultProps`); one variable per variant holds.
5. One variant verified in 9:16 + 4:5 + 1:1 before the batch; MP4s play; (optional) GIF for the README.for f in props/*.json; do id=$(basename "$f" .json); for ar in 9x16 4x5 1x1; do
npx remotion render AdTemplate "out/${id}-${ar}.mp4" --props="$f" --props-merge="{"aspect":"${ar}"}"
done; done
npx remotion render AdTemplate out/demo.gif --codec=gif --props=props/v1.json # README演示用GIF
**完成前检查:**
1. `npx remotion still`渲染钩子/中间/CTA帧时无错误,无字体/资源缺失。
2. 钩子/优惠/证明/CTA文本准确,品牌颜色正确;关键内容未位于9:16底部三分之一或中心安全区域外。
3. 仅由帧驱动——无CSS/库定时器、`Date.now()`或`Math.random()`。
4. 真实行属性渲染正确(而非仅`defaultProps`);每个变体仅含一个变量。
5. 一个变体已验证9:16 + 4:5 + 1:1版本;MP4可正常播放;(可选)为README生成GIF。Reference files
参考文件
- — the full runnable Remotion ad template, the CSV→typed-props parser with validation, a one-variable test-matrix generator, the brand-lock theme object, and the complete batch + multi-aspect render script.
references/batch-ad-pipeline.md - — exact 2025/2026 pixel safe zones, durations, aspect ratios, and format limits for Meta Feed/Reels/Stories, TikTok In-Feed, and YouTube, plus a hook→CTA message-match worksheet.
references/platform-specs.md
- ——完整可运行的Remotion广告模板、带验证的CSV→类型化属性解析器、单变量测试矩阵生成器、品牌锁定主题对象,以及完整的批量+多宽高比渲染脚本。
references/batch-ad-pipeline.md - ——2025/2026年Meta Feed/Reels/Stories、TikTok信息流、YouTube的精确像素安全区域、时长、宽高比和格式限制,以及钩子→CTA消息匹配工作表。
references/platform-specs.md