mcpField
V
video-ad-generator

video-ad-generator

github.com/creatify-ai营销与增长6845 次安装34 周前更新
代码仓库

关于 video-ad-generator

Video Ad Generator 是一套视频广告创作与 API 自动化框架,面向需要规划创意并批量制作广告的营销和电商团队。它涵盖脚本、视频结构、多平台格式与测试策略,并提供 Creatify API 自动化示例。

主要功能

  1. 01提供创意简报与开场钩子模板
  2. 02规划广告正文结构和行动号召
  3. 03制定多平台视频格式方案
  4. 04提供广告变量 A/B 测试流程
  5. 05通过 Creatify API 自动生成素材

适用场景

  1. 01为产品制定视频广告创意
  2. 02将产品页面转换为视频广告
  3. 03为多个平台调整广告尺寸
  4. 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)
  1. 问题(2-3 秒):清楚指出痛点
  2. 激化(3-5 秒):营造紧迫感——展示不解决问题的后果
  3. 解决(5-8 秒):将产品作为顺理成章的解决方案引入

适用场景: 由痛点驱动的产品、健康/保健、效率工具

功能层层递进
  1. 核心功能(3-4 秒):先展示最令人印象深刻的能力
  2. 辅助功能 1(2-3 秒):补充可信度或实用价值
  3. 辅助功能 2(2-3 秒):回应次要顾虑
  4. 证明(2-3 秒):快速展示社会认同或演示结果

适用场景: 科技产品、SaaS、功能丰富的产品

社会认同层层叠加
  1. 推荐语/评论引述(3-4 秒):引用真实客户的评价
  2. 视觉证明(3-4 秒):前后对比、产品演示或结果截图
  3. 数量证明(2-3 秒):“加入 [X] 位客户”或星级评分
  4. 紧迫感(2-3 秒):限时优惠或稀缺性

适用场景: 电商、订阅产品、竞争激烈的市场

前后对比
  1. 之前的状态(3-5 秒):用画面展示问题
  2. 转变时刻(2-3 秒):展示产品如何发挥作用
  3. 之后的状态(3-5 秒):展示改善后的结果
  4. 获取方式(2-3 秒):行动号召(CTA)

适用场景: 美容、健身、家居改造、清洁产品

一日生活记录
  1. 晨间日常(3-4 秒):将产品融入日常生活情境
  2. 关键时刻(3-4 秒):“顿悟”时刻或主要使用场景
  3. 结果/感受(3-4 秒):情感上的满足
  4. 邀请尝试(2-3 秒):“亲自试试”的行动号召

适用场景: 生活方式产品、UGC 风格广告、TikTok/Reels

1.4 CTA 模式
CTA 类型示例适用场景
直接“立即购买”/“今天就入手”电商、意图明确
激发好奇“看看为什么有 [X] 人改用了它”考虑阶段
紧迫感“仅剩 [X] 件,仍享此价格”库存有限、促销活动
消除风险“免费试用 30 天”SaaS、订阅、高价商品
社交认同“加入 [X] 位满意客户的行列”以社群为驱动的产品
强调收益“今天就开始实现[预期成果]”带来转变的产品
1.5 多格式广告策略
平台格式指南
平台主要格式次要格式最长时长自动播放?
TikTok9:16—60s(15-30s 最佳)是,默认开启声音
Instagram Reels9:16—90s(15-30s 最佳)是,默认关闭声音
Instagram Feed1:1 或 4:59:1660s(15s 最佳)是,默认关闭声音
Facebook Feed1:1 或 4:516:9240s(15-30s 最佳)是,默认关闭声音
YouTube Shorts9:16—60s(30-45s 最佳)是,默认开启声音
YouTube Pre-roll16:9—15s 或 30s(不可跳过:6-15s)是,默认开启声音
LinkedIn16: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)
多格式制作策略

在多个平台上创建广告系列时:

  1. 主素材:先创建 9:16 版本(竖屏适用于大多数平台)
  2. 调整为 1:1:裁剪或重新构图,以适配信息流版位
  3. 调整为 16:9:满足 YouTube/LinkedIn 的横屏需求
  4. 始终创建文字安全版(内嵌字幕),适用于关闭声音的平台
1.6 A/B 测试框架
测试内容(优先级排序)
  1. 开场钩子(影响最大):使用相同正文测试 3-5 种不同开场钩子
  2. CTA:测试 2-3 种 CTA 变体
  3. 格式/宽高比:在同一平台测试 9:16 和 1:1
  4. 时长:使用相同内容测试 15s 和 30s
  5. 虚拟形象/主持人:测试不同的人口特征或风格
  6. 音乐/音频:测试背景音乐、无音乐和仅配音
测试规则
  • 每次测试只更改一个变量
  • 每个变体至少花费 $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 分钟内即可获取:

  1. 在 creatify.ai 免费注册
  2. 前往 Settings → API
  3. 复制 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 脚本生成110-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

另请参阅

评论

支持 Markdown