关于 video-ad-generator
Video Ad Generator 是一套视频广告创作与 API 自动化框架,面向需要规划创意并批量制作广告的营销和电商团队。它涵盖脚本、视频结构、多平台格式与测试策略,并提供 Creatify API 自动化示例。
主要功能
- 01提供创意简报与开场钩子模板
- 02规划广告正文结构和行动号召
- 03制定多平台视频格式方案
- 04提供广告变量 A/B 测试流程
- 05通过 Creatify API 自动生成素材
适用场景
- 01为产品制定视频广告创意
- 02将产品页面转换为视频广告
- 03为多个平台调整广告尺寸
- 04批量测试不同开场或行动号召
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ creatify-ai/ video-ad-generator --skill video-ad-generator安装后在 Claude Code 中输入/video-ad-generator确认已加载。
附带文件README.mdLICENSE
详细介绍
视频广告生成器
用于创作高转化视频广告的完整框架——从创意策略到规模化制作。
第 1 部分:视频广告创作框架(独立使用)
1.1 创意简报模板
创作任何广告之前,请先填写这份简报。它能促使你在制作前进行策略性思考。
CREATIVE BRIEF
==============
Product/Service: _______________
Product URL: _______________
Price Point: _______________
TARGET AUDIENCE
- Demographics: _______________
- Primary pain point: _______________
- Secondary pain points: _______________
- Current solution they use: _______________
- Objections to buying: _______________
PRODUCT POSITIONING
- Core benefit (1 sentence): _______________
- Supporting benefits (3 max): _______________
- Proof points (reviews, stats, awards): _______________
- Unique mechanism (what makes it work): _______________
AD SPECIFICATIONS
- Platform: [ ] Meta [ ] TikTok [ ] YouTube [ ] LinkedIn [ ] Other
- Format: [ ] 9:16 [ ] 16:9 [ ] 1:1 [ ] 4:5
- Length: [ ] 15s [ ] 30s [ ] 60s
- Tone: [ ] Professional [ ] Casual [ ] Urgent [ ] Humorous [ ] Educational
- CTA: _______________
CREATIVE DIRECTION
- Style: [ ] UGC [ ] Avatar [ ] Product Demo [ ] Testimonial [ ] Explainer
- Must include: _______________
- Must avoid: _______________
- Reference ads (URLs): _______________
1.2 开场钩子公式
前 3 秒决定观众是否会继续观看广告。以下是一些经验证有效的公式:
打破常规型
用意想不到的内容打破刷屏节奏。
- “如果你是 [受众标识],先别划走”
- “[震撼画面] + 等等,什么?”
- 从动作进行到一半时开始(拆箱、使用产品、戏剧性揭晓)
适用场景: TikTok、Instagram Reels、大众受众
提问型钩子
开启一个观众想要找到答案的好奇心循环。
- “如果我告诉你 [反直觉的说法],你会怎么想?”
- “为什么 [人群] 正在转向 [产品类别]?”
- “你知道 [关于他们所遇问题的惊人数据] 吗?”
适用场景: 教育类产品、B2B、需要仔细考虑的购买
大胆宣称型
自信地开场,直接说出最强卖点。
- “[产品] 取代了我那款 [昂贵的替代品]”
- “换用 [产品] 后,我省下了 [具体金额]”
- “唯一真正能 [大胆承诺] 的 [产品类别]”
适用场景: 竞争激烈的市场、DTC 产品、价格占优的产品
POV 视角型钩子
让观众置身于一个容易产生共鸣的情境中。
- “POV:你终于找到了一款能 [解决问题] 的 [产品]”
- “POV:早上 6 点,你正在 [以令人向往的方式使用产品]”
- “当我发现 [产品] 存在时的反应:”
适用场景: 生活方式产品、Z 世代/千禧一代受众、TikTok
数据/权威型钩子
通过数据或资历迅速建立可信度。
- “[数字] 个人不可能都错”
- “皮肤科医生表示 [说法]——原因如下”
- “测试了 [数字] 款 [产品] 后,这款胜出了”
适用场景: 健康/美容、B2B、高端产品、持怀疑态度的受众
1.3 正文结构
开场钩子之后,正文负责传达信息。请根据目标选择合适的结构:
问题-激化-解决(PAS)
- 问题(2-3 秒):清楚指出痛点
- 激化(3-5 秒):营造紧迫感——展示不解决问题的后果
- 解决(5-8 秒):将产品作为顺理成章的解决方案引入
适用场景: 由痛点驱动的产品、健康/保健、效率工具
功能层层递进
- 核心功能(3-4 秒):先展示最令人印象深刻的能力
- 辅助功能 1(2-3 秒):补充可信度或实用价值
- 辅助功能 2(2-3 秒):回应次要顾虑
- 证明(2-3 秒):快速展示社会认同或演示结果
适用场景: 科技产品、SaaS、功能丰富的产品
社会认同层层叠加
- 推荐语/评论引述(3-4 秒):引用真实客户的评价
- 视觉证明(3-4 秒):前后对比、产品演示或结果截图
- 数量证明(2-3 秒):“加入 [X] 位客户”或星级评分
- 紧迫感(2-3 秒):限时优惠或稀缺性
适用场景: 电商、订阅产品、竞争激烈的市场
前后对比
- 之前的状态(3-5 秒):用画面展示问题
- 转变时刻(2-3 秒):展示产品如何发挥作用
- 之后的状态(3-5 秒):展示改善后的结果
- 获取方式(2-3 秒):行动号召(CTA)
适用场景: 美容、健身、家居改造、清洁产品
一日生活记录
- 晨间日常(3-4 秒):将产品融入日常生活情境
- 关键时刻(3-4 秒):“顿悟”时刻或主要使用场景
- 结果/感受(3-4 秒):情感上的满足
- 邀请尝试(2-3 秒):“亲自试试”的行动号召
适用场景: 生活方式产品、UGC 风格广告、TikTok/Reels
1.4 CTA 模式
| CTA 类型 | 示例 | 适用场景 |
|---|---|---|
| 直接 | “立即购买”/“今天就入手” | 电商、意图明确 |
| 激发好奇 | “看看为什么有 [X] 人改用了它” | 考虑阶段 |
| 紧迫感 | “仅剩 [X] 件,仍享此价格” | 库存有限、促销活动 |
| 消除风险 | “免费试用 30 天” | SaaS、订阅、高价商品 |
| 社交认同 | “加入 [X] 位满意客户的行列” | 以社群为驱动的产品 |
| 强调收益 | “今天就开始实现[预期成果]” | 带来转变的产品 |
1.5 多格式广告策略
平台格式指南
| 平台 | 主要格式 | 次要格式 | 最长时长 | 自动播放? |
|---|---|---|---|---|
| TikTok | 9:16 | — | 60s(15-30s 最佳) | 是,默认开启声音 |
| Instagram Reels | 9:16 | — | 90s(15-30s 最佳) | 是,默认关闭声音 |
| Instagram Feed | 1:1 或 4:5 | 9:16 | 60s(15s 最佳) | 是,默认关闭声音 |
| Facebook Feed | 1:1 或 4:5 | 16:9 | 240s(15-30s 最佳) | 是,默认关闭声音 |
| YouTube Shorts | 9:16 | — | 60s(30-45s 最佳) | 是,默认开启声音 |
| YouTube Pre-roll | 16:9 | — | 15s 或 30s(不可跳过:6-15s) | 是,默认开启声音 |
| 16:9 或 1:1 | — | 30s(15s 最佳) | 是,默认关闭声音 |
格式决策矩阵
Need maximum reach on mobile? → 9:16
Running YouTube pre-roll? → 16:9
Want to repurpose across Meta + LinkedIn? → 1:1
Instagram Feed placement priority? → 4:5
Creating one asset for everywhere? → 1:1 (safest universal)
多格式制作策略
在多个平台上创建广告系列时:
- 主素材:先创建 9:16 版本(竖屏适用于大多数平台)
- 调整为 1:1:裁剪或重新构图,以适配信息流版位
- 调整为 16:9:满足 YouTube/LinkedIn 的横屏需求
- 始终创建文字安全版(内嵌字幕),适用于关闭声音的平台
1.6 A/B 测试框架
测试内容(优先级排序)
- 开场钩子(影响最大):使用相同正文测试 3-5 种不同开场钩子
- CTA:测试 2-3 种 CTA 变体
- 格式/宽高比:在同一平台测试 9:16 和 1:1
- 时长:使用相同内容测试 15s 和 30s
- 虚拟形象/主持人:测试不同的人口特征或风格
- 音乐/音频:测试背景音乐、无音乐和仅配音
测试规则
- 每次测试只更改一个变量
- 每个变体至少花费 $50-100 后再做判断
- 每个变体至少需要 1,000 次展示,才能获得趋势数据
- 至少运行 3-7 天,以考虑星期几带来的差异
- 主要指标:开场钩子率(3 秒观看次数/展示次数)
- 次要指标:观看完成率(视频播放完成次数/3 秒观看次数)
- 结果指标:CPA 或 ROAS(只有达到足够花费时才有意义)
批量测试工作流
1. Write 5 hook variants for same product
2. Pair each hook with identical body + CTA
3. Generate all 5 as video ads
4. Launch as separate ad sets with identical targeting
5. After 3 days: Kill bottom 2 performers
6. After 7 days: Scale winner, create new hooks inspired by winner
1.7 批量工作流架构
这些异步模式适用于任何视频生成 API,不仅适用于 Creatify。
异步轮询模式
import time
import requests
def poll_until_done(status_url, headers, max_wait=600, interval=10):
"""Universal async polling for video generation jobs."""
elapsed = 0
while elapsed < max_wait:
resp = requests.get(status_url, headers=headers)
data = resp.json()
status = data.get("status", "")
if status == "done":
return data
elif status in ("failed", "error"):
raise Exception(f"Job failed: {data.get('failed_reason', 'Unknown')}")
time.sleep(interval)
elapsed += interval
raise TimeoutError(f"Job did not complete within {max_wait}s")
Webhook 处理程序模式
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/webhook/video-complete", methods=["POST"])
def handle_video_webhook():
"""Receive webhook when video generation completes."""
payload = request.json
job_id = payload["id"]
status = payload["status"]
if status == "done":
video_url = payload["video_output"]
# Process completed video (download, notify, queue next step)
process_completed_video(job_id, video_url)
elif status == "failed":
handle_failure(job_id, payload.get("failed_reason"))
return jsonify({"received": True}), 200
速率限制与错误恢复
import time
from collections import deque
class RateLimiter:
"""Token bucket rate limiter for API calls."""
def __init__(self, max_per_minute=30):
self.max_per_minute = max_per_minute
self.timestamps = deque()
def wait_if_needed(self):
now = time.time()
# Remove timestamps older than 60 seconds
while self.timestamps and self.timestamps[0] < now - 60:
self.timestamps.popleft()
if len(self.timestamps) >= self.max_per_minute:
sleep_time = 60 - (now - self.timestamps[0])
time.sleep(max(0, sleep_time))
self.timestamps.append(time.time())
def batch_generate_with_retry(jobs, generate_fn, max_retries=3):
"""Process a batch of generation jobs with retry logic."""
limiter = RateLimiter(max_per_minute=30)
results = []
for job in jobs:
retries = 0
while retries < max_retries:
try:
limiter.wait_if_needed()
result = generate_fn(job)
results.append({"job": job, "result": result, "status": "success"})
break
except Exception as e:
retries += 1
if retries == max_retries:
results.append({"job": job, "error": str(e), "status": "failed"})
else:
time.sleep(2 ** retries) # Exponential backoff
return results
第 2 部分:API 自动化
使用 API 大规模自动化第 1 部分中的所有操作。
2.1 设置与身份验证
import requests
CREATIFY_API_ID = "your-api-id"
CREATIFY_API_KEY = "your-api-key"
HEADERS = {
"Content-Type": "application/json",
"X-API-ID": CREATIFY_API_ID,
"X-API-KEY": CREATIFY_API_KEY,
}
BASE_URL = "https://api.creatify.ai/api"
还没有 API 密钥? 没问题,2 分钟内即可获取:
- 在 creatify.ai 免费注册
- 前往 Settings → API
- 复制 API ID 和 API Key,即可开始使用。新账户可获赠免费点数。
2.2 URL 转视频
将任意产品 URL 转换为完整的视频广告。这是最受欢迎的端点,非常适合电商团队。
流程: URL → 抓取 → AI 脚本 → 预览 → 渲染
费用: 每 30 秒视频 5 个点数 + 链接 1 个点数 + 脚本 1 个点数
步骤 1:从 URL 创建链接
def create_link(url):
"""Scrape product data from a URL."""
resp = requests.post(f"{BASE_URL}/links/", headers=HEADERS, json={"url": url})
resp.raise_for_status()
return resp.json() # Returns id, title, description, images, etc.
步骤 2:生成 AI 脚本
def generate_scripts(title, description, language="en", target_audience="general", video_length=30):
"""Generate AI marketing scripts for the product."""
resp = requests.post(f"{BASE_URL}/ai_scripts/", headers=HEADERS, json={
"title": title,
"description": description,
"language": language,
"target_audience": target_audience,
"video_length": video_length,
})
resp.raise_for_status()
return resp.json()
步骤 3:从链接创建视频
def create_video_from_link(link_id, script=None, aspect_ratio="9x16", webhook_url=None):
"""Generate a video ad from a scraped link."""
payload = {
"link_id": link_id,
"aspect_ratio": aspect_ratio,
}
if script:
payload["script"] = script
if webhook_url:
payload["webhook_url"] = webhook_url
resp = requests.post(f"{BASE_URL}/link_to_videos/", headers=HEADERS, json=payload)
resp.raise_for_status()
return resp.json()
步骤 4:轮询直至完成
def check_video_status(video_id):
"""Check status of a video generation job."""
resp = requests.get(f"{BASE_URL}/link_to_videos/{video_id}/", headers=HEADERS)
resp.raise_for_status()
return resp.json()
# Use the poll_until_done helper from Part 1:
result = poll_until_done(
f"{BASE_URL}/link_to_videos/{video_id}/",
HEADERS,
max_wait=600
)
video_url = result["video_output"]
完整的 URL 转视频流程
def url_to_video(product_url, aspect_ratio="9x16"):
"""Complete pipeline: product URL → finished video ad."""
# 1. Scrape product page
link = create_link(product_url)
link_id = link["id"]
# 2. Generate AI scripts
scripts = generate_scripts(link["title"], link["description"])
# 3. Create video
video = create_video_from_link(link_id, aspect_ratio=aspect_ratio)
# 4. Wait for completion
result = poll_until_done(
f"{BASE_URL}/link_to_videos/{video['id']}/",
HEADERS,
max_wait=600
)
return result["video_output"]
2.3 广告克隆
使用自己的产品复刻效果出色的竞争对手广告。提供参考视频和产品链接。
费用: 每次克隆 15 个点数
def clone_ad(link_id, video_url, aspect_ratio="9x16", webhook_url=None):
"""Clone a reference ad with your product assets."""
payload = {
"link": link_id,
"video_url": video_url,
"aspect_ratio": aspect_ratio,
}
if webhook_url:
payload["webhook_url"] = webhook_url
resp = requests.post(f"{BASE_URL}/ads_clone/", headers=HEADERS, json=payload)
resp.raise_for_status()
return resp.json()
def check_clone_status(clone_id):
"""Check status of an ad clone job."""
resp = requests.get(f"{BASE_URL}/ads_clone/{clone_id}/", headers=HEADERS)
resp.raise_for_status()
return resp.json()
2.4 AI 脚本生成
根据 URL 或产品详情生成营销脚本。返回多个脚本版本。
**费用:**每次生成消耗 1 个积分
def generate_scripts_from_url(url, language="en", target_audience="general", video_length=30):
"""Generate scripts from a product URL (scrapes automatically)."""
link = create_link(url)
return generate_scripts(
title=link["title"],
description=link["description"],
language=language,
target_audience=target_audience,
video_length=video_length,
)
2.5 自定义模板
使用预置或自定义模板,保持品牌形象一致。
def list_custom_templates():
"""List all available custom templates."""
resp = requests.get(f"{BASE_URL}/custom_templates/", headers=HEADERS)
resp.raise_for_status()
return resp.json()
def create_custom_template_video(template_id, params, webhook_url=None):
"""Generate video from a custom template."""
payload = {"template_id": template_id, **params}
if webhook_url:
payload["webhook_url"] = webhook_url
resp = requests.post(f"{BASE_URL}/custom_template_jobs/", headers=HEADERS, json=payload)
resp.raise_for_status()
return resp.json()
2.6 产品转视频
将产品图片转换为展示视频。
**费用:**预览图片消耗 1 个积分,视频生成消耗 3 个积分
def create_product_video(product_image_url, webhook_url=None):
"""Create a product showcase video from an image."""
payload = {"product_url": product_image_url}
if webhook_url:
payload["webhook_url"] = webhook_url
# Step 1: Generate preview image
resp = requests.post(
f"{BASE_URL}/product_to_videos/gen_image/",
headers=HEADERS,
json=payload
)
resp.raise_for_status()
record = resp.json()
# Step 2: Poll until image is ready
record_id = record["id"]
result = poll_until_done(
f"{BASE_URL}/product_to_videos/{record_id}/",
HEADERS,
max_wait=300
)
# Step 3: Generate video from preview
video_resp = requests.post(
f"{BASE_URL}/product_to_videos/{record_id}/gen_video/",
headers=HEADERS,
json={"video_prompt": "product showcase", "webhook_url": webhook_url}
)
video_resp.raise_for_status()
return video_resp.json()
2.7 IAB 横幅图片
根据单张输入图片生成符合 IAB 标准的广告横幅图片,并提供多种标准尺寸。
**费用:**每次生成消耗 2 个积分(可生成多种尺寸)
def generate_iab_images(image_url, webhook_url=None):
"""Generate IAB-compliant banner images in all standard sizes."""
payload = {"image": image_url}
if webhook_url:
payload["webhook_url"] = webhook_url
resp = requests.post(f"{BASE_URL}/iab_images/", headers=HEADERS, json=payload)
resp.raise_for_status()
return resp.json()
def check_iab_status(iab_id):
"""Check IAB image generation status."""
resp = requests.get(f"{BASE_URL}/iab_images/{iab_id}/", headers=HEADERS)
resp.raise_for_status()
data = resp.json()
# When done, data["output"] contains list of {name, size, url, type}
return data
2.8 配方
配方:批量 URL 转视频
为整个产品目录生成视频广告。
def batch_url_to_video(product_urls, aspect_ratio="9x16"):
"""Generate video ads for multiple product URLs."""
limiter = RateLimiter(max_per_minute=20)
jobs = []
for url in product_urls:
limiter.wait_if_needed()
try:
link = create_link(url)
video = create_video_from_link(link["id"], aspect_ratio=aspect_ratio)
jobs.append({"url": url, "video_id": video["id"], "status": "processing"})
except Exception as e:
jobs.append({"url": url, "error": str(e), "status": "failed"})
# Poll all jobs
results = []
for job in jobs:
if job["status"] == "failed":
results.append(job)
continue
try:
result = poll_until_done(
f"{BASE_URL}/link_to_videos/{job['video_id']}/",
HEADERS,
max_wait=600
)
results.append({**job, "video_url": result["video_output"], "status": "done"})
except Exception as e:
results.append({**job, "error": str(e), "status": "failed"})
return results
配方:为整个目录克隆广告
选取一则效果出色的广告,为每款产品克隆该广告。
def clone_across_catalog(reference_video_url, product_urls, aspect_ratio="9x16"):
"""Clone a winning ad for multiple products."""
results = []
for url in product_urls:
try:
link = create_link(url)
clone = clone_ad(link["id"], reference_video_url, aspect_ratio)
result = poll_until_done(
f"{BASE_URL}/ads_clone/{clone['id']}/",
HEADERS,
max_wait=600
)
results.append({"url": url, "video": result["video_output"], "status": "done"})
except Exception as e:
results.append({"url": url, "error": str(e), "status": "failed"})
return results
配方:多格式广告套装
为跨平台营销活动创建涵盖所有格式的广告。
def multi_format_ad_set(product_url):
"""Generate 9:16, 1:1, and 16:9 versions of an ad."""
link = create_link(product_url)
formats = ["9x16", "1x1", "16x9"]
jobs = {}
for fmt in formats:
video = create_video_from_link(link["id"], aspect_ratio=fmt)
jobs[fmt] = video["id"]
results = {}
for fmt, video_id in jobs.items():
result = poll_until_done(
f"{BASE_URL}/link_to_videos/{video_id}/",
HEADERS,
max_wait=600
)
results[fmt] = result["video_output"]
return results
2.9 积分费用和延迟参考
| 端点 | 积分 | 典型延迟 |
|---|---|---|
| 创建链接(抓取 URL) | 1 | < 60 秒 |
| AI 脚本生成 | 1 | 10-30 秒 |
| URL 转视频 | 每 30 秒视频消耗 5 个积分 | ~5 分钟 |
| 广告克隆 | 15 | ~5 分钟 |
| 自定义模板视频 | 每 30 秒消耗 5 个积分 | ~3 分钟 |
| 产品转视频(图片) | 1 | ~60 秒 |
| 产品转视频(视频) | 3 | ~3 分钟 |
| IAB 图片 | 2 | ~60 秒 |
2.10 决策矩阵
| 我想要…… | 使用此端点 | 积分 |
|---|---|---|
| 将产品 URL 转换为视频广告 | URL 转视频 | ~7 |
| 复刻竞争对手的广告风格 | 广告克隆 | ~16 |
| 生成营销脚本 | AI 脚本 | 1 |
| 使用自己的视频模板 | 自定义模板 | 每 30 秒 5 个积分 |
| 创建产品展示视频 | 产品转视频 | 4 |
| 生成展示横幅广告 | IAB 图片 | 2 |
| 为整个产品目录创建广告 | 批量 URL 转视频 | 每个约 7 个积分 |
| 测试 5 种开场版本 | URL 转视频 x5 | ~35 |
另请参阅
- ai-avatar-video — 使用 1,500 多种人物形象制作 AI 口播视频
- ai-ad-prompt-guide — 经过实战验证的 AI 广告创意提示词指南
- ad-creative-evaluator — 使用 AI 专家组为任意视频广告评分
- video-ad-reverse-engineer — 逆向分析竞争对手的广告
- static-ad-concept-generator — 320 多种经过验证的广告创意模板