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,會比一次提交所有高階參數更容易定位問題。

官方資料