Blog/模型对比/

AI 视频生成 API 实测:Veo 3.1、Kling、Seedance 等 8 个模型

AI 视频生成 API 实测:Veo 3.1、Gemini Omni Flash、Kling O3 Pro、Seedance、Wan 3.0 共 8 个文生视频模型,3 条商品短片提示词,对比单条成本、每秒价格、等待时间和翻车点。

AI 视频生成 API 实测封面,对比 Veo 3.1、Kling 和 Seedance;封面为配图,不是测试生成的画面

这次测试里最贵的是 Seedance 2.5,一条 5 秒短片实扣 $1.53。扫地机器人那道题的第一条,它把扫地机开进椅子底下,之后就再也没出来。最便宜的 Veo 3.1 Lite,4 秒一条 $0.12,半分钟左右出片,扫地机顺利绕过椅子,片子结束时差一点就完全开出来了,可我们要求的镜头移动它完全没做。

这篇 AI 视频生成 API 实测 的场景是电商或营销 Agent:拿到商品文案,自动出一条短视频。2026-10-04(UTC),我们让 SandBase 上 8 个文生视频模型跑同样 3 条提示词:带指定文字的促销牌、倒饮料、扫地机从椅子后面穿过。每条片子按固定评分表打分,并记录实际扣费。结果是,每个模型都能出能用的初稿,真正拉开差距的是每秒价格和等待时间,评分反而差不多。

先说结论

  • 8 个模型都把画面里的「SALE 30%」写对了,短视频里的大字已经不难。Veo 3.1 Fast 的问题是会在瓶身上自己加一堆乱码标签,第 1 题的两条都这样。
  • 24 分制评分表上,Gemini Omni Flash(5 秒 $0.65,中位等待 45 秒)和 Wan 3.0(5 秒 $0.50,147 秒)并列最高,都是 23 分;8 个模型全部落在 19 到 23 分之间。
  • 按实扣算,每秒视频的价格从 $0.03(Veo 3.1 Lite)到 $0.30(Seedance 2.5),差 10 倍;中位等待从 35 秒(Veo 3.1 Lite)到 273 秒(Seedance 2.5)。
  • 倒饮料这道题要求镜头从左往右横移,Veo 系列 5 条全是固定机位;两个 Seedance 模型在扫地机那道题上,各至少有一条出现物体连贯性问题。
  • 范围:3 道题、每模型每题 1 条,外加 5 条复测,默认参数,一个时段内完成。只能当候选名单看,不是总排名。

测试设置:8 个模型,一个接口

所有短片都走同一个 Unified Run 接口 POST https://api.sandbase.ai/v1/run 提交,29 次提交全部返回 202 和 "status": "pending"。之后每 5 秒用 GET /v1/run/{id} 轮询,完成后立刻下载 outputs[0].url,因为这个链接是临时的。2026-10-04 00:10(UTC),开跑前我们查了 GET https://api.sandbase.ai/v1/models/<id>,8 个模型都是 enabled: true。这个接口和下面的 GET /v1/tasks/<id>/cost 都要带调用时同一个 Authorization: Bearer Key;没有 Key 也能在公开模型页上看到价格。

参数按各自的 schema 选:有分辨率和画幅选项的统一用 720p、16:9,时长能选 5 秒就用 5 秒。Veo 只支持 4、6、8 秒,所以用了 4 秒。Veo 的 generate_audio 默认开启,一开价格就涨 50% 到 100%(看档位,Veo 3.1 是翻倍),所以我们关掉了;其他模型的音频都保持默认。最后 Seedance、Omni Flash 和 Wan 带音轨,Veo 和 Kling 没有。音频不计分。

模型(SandBase id)发送的参数标价实扣 / 条实扣 / 秒输出(ffprobe)中位等待
google/veo3.14 秒、720p、关音频$0.80$0.80$0.201280×720,24 fps,无音轨45.2 秒
google/veo3.1/fast4 秒、720p、关音频$0.40$0.40$0.101280×720,24 fps,无音轨49.9 秒
google/veo3.1/lite4 秒、720p、关音频$0.12$0.12$0.031280×720,24 fps,无音轨35.3 秒
google/gemini-omni-flash5 秒(无分辨率参数)$0.65$0.65$0.131280×720,24 fps,有音轨45.3 秒
kwaivgi/kling-video/o3/pro/text-to-video5 秒(无分辨率参数),音频默认关$0.56$0.56$0.111920×1080,24 fps,无音轨123.9 秒
bytedance/seedance/2.5/text-to-video5 秒、720p,音频默认开$1.80$1.53$0.301280×720,24 fps,有音轨273.4 秒
bytedance/seedance/2.0/fast/text-to-video5 秒、720p$1.00$0.85$0.171280×720,24 fps,有音轨106.9 秒
alibaba/wan/3.0/video5 秒、720p,音频默认开$0.50$0.50$0.101920×1080,30 fps,有音轨147.1 秒

标价按各模型卡的 price_formula 代入我们的参数算出;实扣取 GET /v1/tasks/<id>/cost 返回的 cost,同一模型每条都一样。每秒价格是实扣除以实测时长:Veo 4.0 秒,其余 5.01 到 5.09 秒。中位等待指第一轮 3 条短片从提交到完成的时间。8 个模型在同一台机器上并行跑,每个模型依次跑完 3 道题:第一轮提交在 00:12 到 00:21(UTC),复测提交到 00:30,最后一条大约 00:34 完成。另外,我们给 Wan 3.0 传的是 720p,它返回的却是 1920×1080、30 fps。

Seedance 2.5 实扣低于标价,是因为当天模型页上挂着折扣。Seedance 2.0 Fast 实扣 $0.85,比 $1.00 标价同样低 15%,不过它的模型页我们没有截。

SandBase 上 bytedance/seedance/2.5/text-to-video 的模型页,显示 15% OFF 标签和 $1.53 价格,原价 $1.80 划掉

截图:Seedance 2.5 模型页显示 15% OFF,$1.53(原价 $1.80),和它 4 条短片每条实扣的 $1.53 一致(2026-10-04 截取)。

三条提示词和评分表

所有模型用同一段英文提示词,商品都是虚构的。提示词保持英文原文,方便直接复制:

P1 (on-screen text): Product commercial shot of a matte white skincare bottle standing on a pastel pink podium in a bright studio. Behind the bottle, a large bold sign shows the exact text "SALE 30%". The camera slowly pushes in toward the bottle. The text "SALE 30%" stays sharp, correctly spelled and readable for the whole clip. No other text anywhere.

P2 (physics and camera): A hand lifts a green glass bottle of sparkling lemon soda and pours it into a tall clear glass filled with ice cubes on a wooden bar counter. The liquid level rises, bubbles and a thin layer of foam form, and a few drops splash. The camera dollies slowly from left to right. Realistic physics, soft daylight.

P3 (object permanence): A bright modern kitchen with one wooden dining chair standing in the middle of the tiled floor. A round black robot vacuum glides across the floor, reaches the chair, steers around its legs, passes briefly behind them and reappears on the other side, continuing in the same direction. Static wide camera, no people, realistic lighting.

P1 是促销牌文字,P2 考物理和运镜,P3 考物体连贯性。每题 4 个评分项,每项 0(没做到)、1(部分做到)或 2(完全做到),单条满分 8,一个模型 3 条满分 24。

题目评分项
P1商品(白瓶、粉色展台);文字(「SALE 30%」每个可见字符都对;被画面边缘切掉记 1 分;被瓶子挡住不扣分,因为提示词本来就让牌子在瓶子后面);推镜;没有多余文字
P2场景(手、绿色玻璃瓶、加冰的杯子、木吧台);倒入(水流进杯、液面上升、冰块不乱动);气泡(气泡加泡沫或溅出的水滴);横移(镜头从左往右)
P3场景(厨房、一把椅子、圆形扫地机、远景、无人);路线(从椅腿旁边或后面绕过,不穿模);连贯(同一台扫地机从另一侧出来,方向不变);固定机位

每条短片取 4 帧打分,位置在时长的 10%、37%、63%、90%。P1、P2 只看这 4 帧;P3 另外看了每条 9 帧,因为扫地机可能在两帧之间钻到椅腿后面。

结果:字都会写,镜头很少照做

模型P1 文字P2 倒饮料P3 扫地机总分(24)实扣 / 条复测
Gemini Omni Flash87823$0.65无
Wan 3.087823$0.50无
Kling O3 Pro86721$0.56无
Veo 3.175820$0.80P2:6
Veo 3.1 Fast66820$0.40P1:5
Veo 3.1 Lite76720$0.12P2:6
Seedance 2.0 Fast77620$0.85P3:4
Seedance 2.585619$1.53P3:7

总分只算每个模型每题的第一条。第一轮之后,我们又花 $3.70 给最想确认的 5 种情况各补了一条,分数列在最后一列,不计入总分。每格只有一条片子,模型之间差 1、2 分,换一条重跑就可能变。复测本身就是例子:Seedance 2.5 的 P3 从 6 分变成 7 分,Seedance 2.0 Fast 却从 6 分掉到 4 分。

画面文字。 8 个模型都把「SALE 30%」写上了牌子,看得见的字符没有一个错。Veo 3.1 扣了 1 分,因为画面上沿切掉了「SALE」的顶部。对广告来说,真正要防的是没人要的字:Veo 3.1 Fast 两条片子都在瓶身上自己编了一张标签,印着「SALE」和几行假单词。后面示例程序跑出的 Veo 3.1 Lite 短片,瓶身上也有小字。如果 Agent 出片后没人审就直接发,这就是最需要拦住的问题。

提示词 1 的 8 帧生成画面,每个模型一帧,都是白瓶后面一块 SALE 30% 牌子;Veo 3.1 Fast 的瓶身多了一张编出来的文字标签

截图:8 个模型 2026-10-04 生成的提示词 1 画面,每个取时长 63% 处一帧。牌子都写着 SALE 30%,只有 Veo 3.1 Fast(上排第二)的瓶身多了文字。

倒饮料和运镜。 8 个模型里有 7 个倒饮料挺像回事:水流进杯,液面上升。弱项在镜头。我们要求从左往右横移,Veo 三个档位、两轮共 5 条,镜头全都一动不动;其他模型最多也只是轻微移动,所以这一项最高只拿到 1 分。另有两条偏离了要求:Kling 的饮料是琥珀色,还顶着一层厚泡沫,看上去更像啤酒而不是柠檬汽水;Seedance 2.5 那条的汽水变成乳白色,冰块也慢慢从杯子里消失了。

提示词 2 的 4 条生成短片,每条 4 帧:Veo 3.1、Gemini Omni Flash、Kling O3 Pro 和 Seedance 2.5

截图:2026-10-04 由 google/veo3.1、google/gemini-omni-flash、kwaivgi/kling-video/o3/pro/text-to-video 和 bytedance/seedance/2.5/text-to-video 生成的提示词 2 画面。Veo 的构图从头到尾不动;Kling 的饮料像啤酒;Seedance 的冰块慢慢消失。

物体连贯性。 这道题最能拉开差距。Veo 3.1、Veo 3.1 Fast、Omni Flash 和 Wan 3.0 都让扫地机从椅腿后面穿过去,从另一侧出来,方向也没变。Veo 3.1 Lite 基本做到了,只是 4 秒结束时扫地机还没完全出来。Seedance 2.5 第一条直接把扫地机停在椅子底下;复测那条倒是开出来了。Seedance 2.0 Fast 第一条中途掉头;复测那条在 2.16 秒到 2.52 秒之间来回跳,不到半秒就在画面里明显跳了位置。另外,Kling 和 Seedance 2.5 的复测用了贴地近景,而不是要求的远景,椅子上半部分出了画;Kling 和 Seedance 2.0 Fast 的复测还多出了没人要的家具,一个是多出来的椅腿,一个是一张桌子。

提示词 3 的 4 条扫地机短片:Wan 3.0 和 Veo 3.1 从椅子后面穿过并开出;Seedance 2.5 停在椅子下面;Seedance 2.0 Fast 在相邻帧之间跳位

截图:2026-10-04 由 alibaba/wan/3.0/video、google/veo3.1、bytedance/seedance/2.5/text-to-video(第 1 条)和 bytedance/seedance/2.0/fast/text-to-video(第 2 条,相邻帧间隔 0.18 秒)生成的提示词 3 画面,每帧都标了时间。

能让视觉 LLM 来打分吗?

试了两个,一个能用。两个评审模型拿到和我们一样的帧图和评分表,每条短片调用一次,走 OpenAI 兼容的 Chat Completions 接口。

评审模型有效回复与人工分数完全一致相差不超过 1 分24 次调用成本
openai/gpt-6.1-sol24/2479/9696/96$0.087
google/gemini-3.8-flash23/2417/9292/92$0.195

GPT-6.1 Sol 抓住了关键问题:Veo 3.1 Fast 的瓶身文字给了 0 分,Seedance 2.5 的扫地机连贯性给了 0 分,也指出 Veo 3.1 没有横移。它和我们的 17 处分歧里,14 处比我们判得松,其中 7 处是运镜:我们给 1 分的「轻微右移」,它给 2 分;另外 3 处比我们严,都在扫地机的路线或连贯性上。Gemini 3.8 Flash 则把每条片子的每一项都打成 1 分,哪怕它自己的备注已经写出了问题;还有一次回复写到 1,500 token 上限就被截断了。Sol 每次调用大约三分之一美分,拿来筛全部短片足够便宜,只是运镜那一项最好再让人看一眼。

怎么选

需求先试注意
便宜的初稿、大量变体Veo 3.1 Lite:4 秒 $0.12,中位 35 秒P2 两条都是固定机位;示例运行里出现了瓶身小字
中等价位、评分最高、出片快Gemini Omni Flash:23/24,5 秒 $0.65,45 秒没有分辨率参数,输出 720p
评分最高、同分里每秒最便宜、1080pWan 3.0:23/24,5 秒 $0.50,1080p 30 fps中位等待 147 秒;传 720p 返回的是 1080p
5 秒 1080p、不要音频Kling O3 Pro:21/24,$0.56饮料像啤酒;P3 用了贴地机位
每条都要原生音频Seedance 2.5、Wan 3.0 或 Omni FlashSeedance 2.5 最慢(273 秒)、最贵($0.30/秒),P3 还翻过车

对商品短片 Agent,这次测下来最省钱又可行的流程是三步:先用 Veo 3.1 Lite 出初稿,选中的再用 Omni Flash 或 Wan 3.0 重渲,所有片子都过一遍视觉评审,外加一道「有没有多余文字」的检查。镜头运动是硬要求的话,不管用哪个模型,都要预留重试的预算。

自己跑一条

下面的程序就是上面流程里的一条:用 POST /v1/run 提交,每 5 秒轮询一次 GET /v1/run/{id};下载 outputs[0].url 并核对字节数;用 ffprobe 读时长、分辨率、帧率和音轨;最后从 GET /v1/tasks/{id}/cost 取实扣费用。任务失败或超时、下载不完整、费用迟迟不结算,程序都会抛异常;实际时长和请求差 0.5 秒以上会打印警告。模型用的是这次单条最便宜的 Veo 3.1 Lite。

"""Generate one product clip on SandBase, download it, check it with ffprobe and record the billed cost.

Usage: SANDBASE_API_KEY=... python3 video_clip_check.py
Needs ffprobe (part of FFmpeg) on PATH.
"""
import json
import os
import subprocess
import time

import requests

BASE = "https://api.sandbase.ai/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['SANDBASE_API_KEY']}"}
MODEL = "google/veo3.1/lite"
PARAMS = {"duration": 4, "resolution": "720p", "aspect_ratio": "16:9", "generate_audio": False}
PROMPT = ('Product commercial shot of a matte white skincare bottle standing on a pastel pink podium in a bright studio. '
          'Behind the bottle, a large bold sign shows the exact text "SALE 30%". The camera slowly pushes in toward the bottle. '
          'The text "SALE 30%" stays sharp, correctly spelled and readable for the whole clip. No other text anywhere.')
FINISHED = ("completed", "failed", "timeout", "cancelled")


def generate(timeout_s: int = 900) -> dict:
    """Submit with POST /v1/run, then poll GET /v1/run/{id} until the run finishes."""
    resp = requests.post(f"{BASE}/run", headers=HEADERS, json={"model": MODEL, "prompt": PROMPT, **PARAMS}, timeout=120)
    resp.raise_for_status()
    run, start = resp.json(), time.time()
    while run.get("status") not in FINISHED:
        if time.time() - start > timeout_s:
            raise TimeoutError(f"{run['id']} still {run.get('status')} after {timeout_s}s")
        time.sleep(5)
        poll = requests.get(f"{BASE}/run/{run['id']}", headers=HEADERS, timeout=60)
        poll.raise_for_status()
        run = poll.json()
    if run["status"] != "completed" or not run.get("outputs"):
        raise RuntimeError(f"{run['id']}: {run['status']} {run.get('error')}")
    run["seconds_to_done"] = round(time.time() - start, 1)
    return run


def download(url: str, path: str) -> None:
    """Output URLs are temporary, so save the file right away and check the byte count."""
    resp = requests.get(url, timeout=300)
    resp.raise_for_status()
    expected = int(resp.headers.get("content-length", len(resp.content)))
    if len(resp.content) != expected:
        raise IOError(f"incomplete download: {len(resp.content)} of {expected} bytes")
    with open(path, "wb") as fh:
        fh.write(resp.content)


def probe(path: str) -> dict:
    """Duration, size, frame rate and audio streams, read with ffprobe."""
    out = subprocess.run(["ffprobe", "-v", "error", "-show_streams", "-show_format", "-of", "json", path],
                         capture_output=True, text=True, check=True).stdout
    info = json.loads(out)
    video = next(s for s in info["streams"] if s["codec_type"] == "video")
    num, den = video["avg_frame_rate"].split("/")
    return {"duration_s": round(float(info["format"]["duration"]), 2), "width": video["width"], "height": video["height"],
            "fps": round(int(num) / int(den), 2), "audio_streams": sum(s["codec_type"] == "audio" for s in info["streams"])}


def billed_cost(task_id: str) -> float:
    """GET /v1/tasks/{id}/cost returns what this task was charged; it can take a few seconds to settle."""
    for _ in range(6):
        cost = requests.get(f"{BASE}/tasks/{task_id}/cost", headers=HEADERS, timeout=60).json()
        if cost.get("settled"):
            return float(cost["cost"])
        time.sleep(5)
    raise RuntimeError(f"cost for {task_id} not settled: {cost}")


if __name__ == "__main__":
    run = generate()
    path = "clip.mp4"
    download(run["outputs"][0]["url"], path)
    info = probe(path)
    cost = billed_cost(run["id"])
    if abs(info["duration_s"] - PARAMS["duration"]) > 0.5:
        print(f"WARNING: asked for {PARAMS['duration']} s, got {info['duration_s']} s")
    print(f"run id         {run['id']}")
    print(f"model          {MODEL}")
    print(f"submit->done   {run['seconds_to_done']} s")
    print(f"video          {info['width']}x{info['height']}, {info['fps']} fps, {info['duration_s']} s, audio streams: {info['audio_streams']}")
    print(f"billed         ${cost:.4f}  (${cost / info['duration_s']:.4f} per second of video)")

实测于 2026-10-04(UTC)。 上面的程序原样跑了一次,时间 00:41:32 到 00:42:04(UTC)。输入是提示词 1,虚构商品,不含任何第三方内容。请求为 POST https://api.sandbase.ai/v1/run,请求体 {"model": "google/veo3.1/lite", "prompt": "<prompt 1>", "duration": 4, "resolution": "720p", "aspect_ratio": "16:9", "generate_audio": false}。最后一次 GET /v1/run/{id} 返回下面这个对象,只省略了 outputs[0] 里的 url 键,因为那是临时下载链接:

{"id": "90588389-7c5e-4509-91f2-9b265ad8abaf", "status": "completed",
 "model": "google/veo3.1/lite",
 "outputs": [{"content_type": "video/mp4"}]}

GET /v1/tasks/90588389-7c5e-4509-91f2-9b265ad8abaf/cost 的返回如下,省略了 usage 键(视频任务里全是 0):

{"id": "90588389-7c5e-4509-91f2-9b265ad8abaf", "status": "completed", "settled": true,
 "currency": "USD", "cost": "0.120000", "estimated_cost": "0.120000"}

程序输出:

run id         90588389-7c5e-4509-91f2-9b265ad8abaf
model          google/veo3.1/lite
submit->done   28.1 s
video          1280x720, 24.0 fps, 4.0 s, audio streams: 0
billed         $0.1200  ($0.0300 per second of video)

这条短片我们用肉眼检查过:牌子上是 SALE 30%,瓶子挡住了一部分「0」;瓶身上印了提示词没要求的小字。程序读取的字段(id、status、outputs[0].url、settled、cost)都出现在上面这些实际响应里,但这是我们观察到的结果,不代表每个模型都有文档保证。

SandBase 上 google/veo3.1/lite 的模型页,显示每次 $0.40、异步执行、7 个输入字段

截图:Veo 3.1 Lite 模型页标的 $0.40 对应默认配置(8 秒、开音频);我们 4 秒、关音频的请求按价格公式实扣 $0.12(2026-10-04 截取)。

模型页上的大号价格对应的是默认配置,换了参数要自己按公式算。Kling O3 Pro 的 $0.56 正好是 5 秒、无音频的默认值,也就是我们跑的那种。

SandBase 上 kwaivgi/kling-video/o3/pro/text-to-video 的模型页,显示每次 $0.56、6 个输入字段

截图:Kling O3 Pro 模型页标价每次 $0.56,与它 3 条 5 秒短片各自的实扣一致(2026-10-04 截取)。

每个模型的参数都写在各自的模型页上,比如 Veo 3.1 Lite;其他模型见 SandBase 模型目录。想拿自己的商品文案跑一遍,可以先申请 SandBase API Key。

数据范围:所有提示词都是虚构商品,文中每一帧画面都是我们自己生成的。提示词、评分表、各模型得分、价格和总花费都写在本文里;短片文件、帧图和评审回复保存在内部。想看这些厂商的功能对比,可以读AI 视频生成 API 选型;想深入了解并列第一的 Omni Flash,见Gemini Omni Flash 解读;静态图片的逐字检查方法,见AI 生图文字渲染实测。

这次测试花了多少

项目依据费用
第一轮 24 条短片GET /v1/tasks/<id>/cost 合计$16.23
5 条复测同上$3.70
两个视觉评审,48 次调用同上$0.28
示例程序运行同上$0.12
模型页截图 4 次截图工具报告的费用$0.02
合计$20.35

常见问题

2026 年做商品短片,哪个 AI 视频生成 API 最好?

在我们这 3 条商品提示词上,Gemini Omni Flash 和 Wan 3.0 并列 23/24。Omni Flash 更快(中位 45 秒),Wan 3.0 更便宜(5 秒 $0.50,还是 1080p)。每题只有一条片子,8 个模型可以看作差距不大,按价格、等待时间和分辨率来选。

Veo 3.1 和 Kling 哪个好?

这次 Kling O3 Pro 拿了 21/24,5 秒 1080p 一条 $0.56;Veo 3.1 拿了 20/24,4 秒 720p(关音频)一条 $0.80。Veo 更快(中位 45 秒对 124 秒),扫地机那题也守住了远景构图;Kling 的文字镜头很干净,但把柠檬汽水拍成了啤酒。

AI 视频模型能准确写出画面里的文字吗?

像「SALE 30%」这种印在大牌子上的短字符串可以,8 个模型都写对了。真正的风险是多出没要求的字:Veo 3.1 Fast 第 1 题的两条片子都自己编了瓶身标签。

AI 生成商品视频每秒多少钱?

按 2026-10-04 的实扣和我们的参数,从每秒 $0.03(Veo 3.1 Lite,720p,无音频)到每秒 $0.30(Seedance 2.5,720p,带音频,已含 15% 折扣)不等。Veo 打开音频,价格会涨 50% 到 100%,看档位。

Gemini Omni Flash 做视频怎么样?

它并列评分第一,也是这次最快的几个之一:中位 45 秒,5 秒 $0.65。它没有分辨率参数,返回的是带音轨的 720p。

局限

这次只有 3 道题,每个模型每题 1 条,外加 5 条复测,都在 2026-10-04 的同一个时段内生成,默认参数、16:9。Seedance 的复测已经说明,1 到 2 分的差距换一条就可能变。分数来自一位评审看每条 4 帧(P3 看 9 帧),帧与帧之间的运动瑕疵可能漏掉;音频、口型和 5 秒以上的表现都没测。时长也不完全一样:Veo 4 秒,其余 5 秒,所以请按每秒价格比较。等待时间受排队和我们的客户端影响,8 个模型是在同一台机器上并行跑的。价格和折扣是 2026-10-04 的快照。正式选默认模型之前,先拿自己的商品文案跑一遍。