Veo 3.1 API 视频生成教程:首尾帧、参考图、4K 与异步轮询

Veo 3.1 Gemini API 教程,覆盖文本与图片生成视频、首尾帧、参考图、视频扩展、4K 参数、长任务轮询、下载和错误排查。

Veo 3.1 已进入 Gemini API,支持文本、图片和已有视频作为输入,并原生生成带音频的视频。 它不是同步返回 MP4 的普通接口,而是先创建 long-running operation,再轮询状态并下载结果。 本文按这个异步模型组织代码,同时解释首尾帧、参考图、视频扩展、分辨率和时长之间的限制。

先选 Veo 3.1、Fast 还是 Lite

官方当前提供 Veo 3.1、Veo 3.1 Fast 和 Veo 3.1 Lite 等路线。 标准版适合画面一致性、复杂镜头和高质量实验。 Fast 版更适合交互预览与批量筛选提示词。 Lite 面向更低成本和更快生成,但功能集合与最高分辨率可能不同。 模型仍可能处于 preview,生产系统要锁定模型 ID,并接受接口字段变化。 不要只在控制台里写“Veo 3.1”,代码需要使用官方文档当前列出的完整模型名。

参数组合比单个参数更重要

Veo 3.1 可用时长为 4、6 或 8 秒。 使用 1080p、4K、参考图或视频扩展时,通常要求 8 秒。 宽高比支持 16:99:16。 视频扩展目前只输出 720p。 每个请求生成一个视频。 帧率为 24 fps。 seed 可以提高相似性,但不保证完全确定性。 提交前先验证参数矩阵,能减少等待数分钟后才收到失败。

准备 API key 与 Python 环境

在 Google AI Studio 创建项目与 Gemini API key。 密钥只放环境变量:

1
$env:GEMINI_API_KEY = Read-Host "Gemini API key"

创建独立虚拟环境:

1
2
3
4
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
pip install google-genai pillow

检查包版本:

1
python -m pip show google-genai

preview API 变化时,版本信息比“昨天还能运行”更有排错价值。

第一个文本生成视频请求

以下结构以官方 SDK 当前接口为准,模型 ID 执行前要与文档核对:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import os
import time
from pathlib import Path

from google import genai
from google.genai import types

client = genai.Client(api_key=os.environ["GEMINI_API_KEY"])

operation = client.models.generate_videos(
    model="veo-3.1-generate-preview",
    prompt=(
        "A quiet railway platform at dawn, light fog, "
        "slow dolly movement, realistic ambient sound, no text"
    ),
    config=types.GenerateVideosConfig(
        aspect_ratio="16:9",
        resolution="720p",
        duration_seconds=4,
    ),
)

while not operation.done:
    print("waiting", operation.name)
    time.sleep(10)
    operation = client.operations.get(operation)

video = operation.response.generated_videos[0].video
client.files.download(file=video)
video.save("veo-output.mp4")
print(Path("veo-output.mp4").resolve())

SDK 字段可能随 preview 更新,若属性不存在,先查看安装版本对应的官方示例。

为什么轮询间隔不要太短

生成视频比文本响应耗时长。 每秒轮询不会让视频更早完成,只会增加 API 请求和限流概率。 官方 REST 示例使用 10 秒间隔,这是合理起点。 生产任务可以使用指数退避,但要设置最大间隔和总超时。 将 operation name 保存到数据库,进程重启后可以继续查询。 不要把 operation 对象只留在内存里。

保存任务状态而不是阻塞一个 HTTP 请求

Web 应用收到生成请求后,先返回自己的 job ID。 后台 worker 提交 Veo operation,并保存映射:

1
2
3
4
5
6
7
{
  "job_id": "video_20260728_001",
  "operation_name": "operations/example",
  "status": "running",
  "model": "veo-3.1-generate-preview",
  "created_at": "2026-07-28T12:00:00Z"
}

前端查询自己的 job endpoint,不直接暴露 Gemini key 或完整 operation 数据。 worker 崩溃后读取 operation_name 继续轮询。

图片生成视频使用首帧

首帧图片决定视频开始构图。 选择主体清晰、边缘完整、没有水印和不必要文字的图片。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from PIL import Image

first_frame = Image.open("first-frame.png")

operation = client.models.generate_videos(
    model="veo-3.1-generate-preview",
    prompt="The camera slowly moves closer while leaves sway in the wind",
    image=first_frame,
    config=types.GenerateVideosConfig(
        aspect_ratio="16:9",
        resolution="720p",
        duration_seconds=8,
    ),
)

图片宽高比与输出差异太大时,模型需要裁切或补画边缘。 先在本地把画布处理到 16:9 或 9:16,结果通常更可控。

首帧加尾帧用于插值过渡

Veo 3.1 支持指定开始和结束画面。 尾帧不是一张独立参考图,而是视频最终要过渡到的画面。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
first_frame = Image.open("start.png")
last_frame = Image.open("end.png")

operation = client.models.generate_videos(
    model="veo-3.1-generate-preview",
    prompt="A smooth cinematic transition from morning to night",
    image=first_frame,
    config=types.GenerateVideosConfig(
        last_frame=last_frame,
        aspect_ratio="16:9",
        resolution="1080p",
        duration_seconds=8,
    ),
)

两个画面主体位置差异过大时,模型可能通过形变完成过渡。 先对齐相机角度、主体尺度和地平线,比增加提示词更有效。

参考图用于保持角色或产品

Veo 3.1 可使用最多三张 asset reference image。 参考图适合给出同一角色、产品或风格的不同视角。 三张图若服装、颜色和比例互相冲突,会降低一致性。 使用产品图时保留完整轮廓,避免把品牌文字当成背景纹理。 参考图、1080p 或 4K 请求要按官方限制使用 8 秒时长。 Lite 模型是否支持对应 reference image 类型,以当前参数表为准。

4K 并不是把 720p 参数改成一个字符串

4K 需要标准 Veo 3.1 路线,时长要求 8 秒。 它会增加生成时间、下载体积和后续处理资源。 先用 Fast 或 720p 验证镜头,再对通过的提示词生成 4K。

1
2
3
4
5
config = types.GenerateVideosConfig(
    aspect_ratio="16:9",
    resolution="4k",
    duration_seconds=8,
)

竖屏 4K 是否在当前模型和地区可用,应以请求返回与官方表格为准。 不要批量提交前才第一次验证参数组合。

让提示词同时描述画面和声音

Veo 3.1 原生生成音频,提示词可以描述环境声、对白和音乐气氛。 提示词至少包含主体、动作、场景、镜头、光线和声音。

1
2
3
4
5
A close-up of a ceramic cup on a wooden table.
Steam rises slowly while rain hits the window behind it.
The camera performs a gentle clockwise orbit.
Warm indoor light, shallow depth of field.
Audio: soft rain, distant thunder, no speech, no music.

“cinematic” 不能替代镜头运动和构图说明。 不需要文字时明确写 no text,但仍要检查成片。

视频扩展只能使用 Veo 生成的视频

扩展输入是之前生成结果中的 Video 对象,不是任意上传 MP4。 扩展会使用最后一秒或约 24 帧继续动作。 原视频最后一秒没有声音时,语音通常无法自然延续。 把要延续的动作和声音放到结尾,再请求下一段。 扩展输出目前只支持 720p。 多次扩展会积累视觉和音频漂移,长片应在剪辑软件里管理镜头。

REST 请求的核心是 operation name

不使用 SDK 时,可以调用 predictLongRunning

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
curl -s \
  "https://generativelanguage.googleapis.com/v1beta/models/veo-3.1-generate-preview:predictLongRunning" \
  -H "x-goog-api-key: ${GEMINI_API_KEY}" \
  -H "Content-Type: application/json" \
  -X POST \
  -d '{
    "instances": [{
      "prompt": "A calm ocean at sunrise, slow aerial shot, natural waves"
    }],
    "parameters": {
      "aspectRatio": "16:9",
      "resolution": "720p",
      "durationSeconds": 4,
      "sampleCount": 1
    }
  }'

响应中的 name 用于后续查询。 不要把 API key 放进 URL 查询参数或前端 JavaScript。

轮询 REST operation

1
2
3
curl -s \
  -H "x-goog-api-key: ${GEMINI_API_KEY}" \
  "https://generativelanguage.googleapis.com/v1beta/${OPERATION_NAME}"

donefalse 时继续等待。 donetrue 后,检查是 response 还是 error。 不要假设完成一定成功。 保存完整错误结构和 request ID,避免只显示“生成失败”。

下载 URL 仍然需要 API key

完成响应会给出生成视频 URI。 使用 -L 跟随重定向:

1
2
3
4
curl -L \
  -H "x-goog-api-key: ${GEMINI_API_KEY}" \
  -o veo-result.mp4 \
  "${VIDEO_URI}"

下载后检查文件类型与时长:

1
2
3
ffprobe -v error \
  -show_entries format=duration,size \
  -of json veo-result.mp4

不要只用文件扩展名判断下载是否成功,错误 JSON 也可能被保存成 .mp4

为生成任务设置幂等键

客户端超时后,不要立刻重新提交同一提示词。 先查自己的 job 表是否已有 operation。 用用户 ID、素材哈希、参数和业务请求 ID 生成幂等键。 相同键只允许创建一个上游 operation。 这能避免一次点击产生两份计费视频。

成本控制从两阶段生成开始

第一阶段用 Fast、720p 和 4 秒筛提示词。 第二阶段只把选中的构图升级到 8 秒、1080p 或 4K。 记录模型、分辨率、时长、operation 和最终文件大小。 按成功成片计算成本,不只看单次 API 单价。 内容审核失败、参数失败和用户取消也要计入预算。

常见参数错误

4K 配 4 秒会违反时长要求。 扩展视频请求 1080p 会违反扩展分辨率限制。 reference image 数量超过三张会被拒绝。 首尾帧只提供尾帧而没有首帧无法构成插值。 preview 模型 ID 过期会返回模型不存在。 人物生成限制还可能因地区与输入模式不同。

401403429 分开处理

401 先检查 key 是否进入当前进程。 403 检查项目权限、地区、模型访问和组织策略。 429 检查每分钟请求、并发和项目配额。 不要对 403 无限退避重试。 配额错误应进入队列或提示用户稍后再试。

下载完成后做媒体质量检查

检查容器格式、时长、分辨率、帧率和音轨。

1
2
3
4
ffprobe -v error \
  -show_streams \
  -show_format \
  -of json veo-result.mp4 > veo-result.json

再抽取首帧、中间帧和尾帧:

1
2
3
ffmpeg -i veo-result.mp4 \
  -vf "select='eq(n,0)+eq(n,96)+eq(n,191)'" \
  -vsync 0 frame-%02d.png

帧号要根据真实时长和 fps 调整。

安全与内容权利不能交给参数代替

上传人物、品牌和产品图片前确认使用权。 不要生成用于欺骗、骚扰或冒充的素材。 原图、提示词和生成视频都可能包含个人信息。 临时文件设置保留期限,日志不要存图片 base64。 面向用户的产品还需要内容审核、举报和删除路径。 所有生成图片和视频会受到平台水印与政策约束。

上线前的任务验收

  • operation name 可持久化。
  • worker 重启后能继续轮询。
  • 下载跟随重定向并携带认证。
  • 720p、1080p、4K 参数组合分别测试。
  • 首尾帧和参考图数量符合限制。
  • 重复请求不会重复计费。
  • ffprobe 能确认音视频流。
  • 失败任务保留错误结构而不保存密钥。
  • 用户可删除素材与生成结果。

Veo 3.1 API 的工程难点主要在异步任务、参数矩阵和结果管理。先把 4 秒 720p 流程跑通,再增加首尾帧、参考图和 4K,会比一次提交所有高级参数更容易定位问题。

官方资料