使用 Veo‑3.0 异步 API 将给定图片生成视频,Gemini 视觉先分析图片,Veo 通过 predictLongRunning 创建视频,所有输出保存至 ~/.opencla...
图片给视频生成器(v3.0.0 – 工作 Veo-3.0 REST API). 现状: QQ 测试与工作.是一项面向实际任务的技能,主要用于Last 更新: 2026-04-11. 例:金藏献品 ~ 2.4 MB 视频在~60秒内完成.。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。
执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
状态: ✅ 已测试并正常运行
最后更新时间: 2026-04-11
示例: “金色藏式供品” → 约 60 秒生成 2.4 MB 视频
使用 Google 的 Veo-3.0,基于任意图像生成一段 5 秒钟的电影级视频:
~/.openclaw/workspace/tibetanProc/ 目录,文件名前缀为 yymmddHHMM关键修复(v3.0.0): REST 请求载荷中必须使用 bytesBase64Encoded 字段(不可使用 data 或 inline_data)
python3 << 'PYEOF'
import os
import sys
import json
import time
import base64
import requests
import google.generativeai as genai
from pathlib import Path
from datetime import datetime
GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY")
WORKSPACE = Path.home() / ".openclaw" / "workspace" / "tibetanProc"
WORKSPACE.mkdir(parents=True, exist_ok=True)
TIMESTAMP = datetime.now().strftime("%y%m%d%H%M")
# 第一步:加载图像
IMAGE_PATH = WORKSPACE / f"{TIMESTAMP}_input_image.jpg"
if not IMAGE_PATH.exists():
print("✗ 图像未找到")
sys.exit(1)
print(f"✓ 图像: {IMAGE_PATH.name}")
# 第二步:使用 Gemini 分析
genai.configure(api_key=GOOGLE_API_KEY)
model = genai.GenerativeModel("gemini-2.5-flash")
image_file = genai.upload_file(str(IMAGE_PATH), mime_type="image/jpeg")
prompt = """Analyze for cinematic video: describe subject, setting, lighting, textures,
suggested camera movements (dolly, pan, orbit, zoom, rack focus)."""
response = model.generate_content([prompt, image_file])
analysis = response.text
prompt_path = WORKSPACE / f"{TIMESTAMP}_prompt.md"
with open(prompt_path, "w") as f:
f.write(analysis)
print(f"✓ 分析结果: {prompt_path.name}")
# 第三步:构建增强型提示词
enhanced = f"""VIDEO GENERATION PROMPT
Duration: 5 seconds
Quality: High Definition
SCENE ANALYSIS:
{analysis}
MOTION GUIDELINES:
- Smooth, deliberate camera movement
- Enhance visual depth with elegant transitions
- Maintain consistent lighting
- Cinematic color grading
"""
enhanced_path = WORKSPACE / f"{TIMESTAMP}_enhanced_prompt.txt"
with open(enhanced_path, "w") as f:
f.write(enhanced)
print(f"✓ 增强提示词: {enhanced_path.name}")
# 第四步:调用 Veo API(注意字段命名规范)
with open(IMAGE_PATH, "rb") as f:
image_b64 = base64.b64encode(f.read()).decode("utf-8")
VEO_URL = f"https://generativelanguage.googleapis.com/v1beta/models/veo-3.0-generate-001:predictLongRunning?key={GOOGLE_API_KEY}"
# ✅ 正确的载荷结构(v3.0.0)
payload = {
"instances": [{
"prompt": enhanced,
"image": {
"bytesBase64Encoded": image_b64, # ← 关键:不可用 "data" 或 "inline_data"
"mimeType": "image/jpeg"
}
}]
}
print("n🎬 正在调用 Veo API...")
response = requests.post(VEO_URL, json=payload, timeout=60)
if response.status_code not in [200, 202]:
print(f"✗ API 错误: {response.json()}")
sys.exit(1)
result = response.json()
operation_name = result.get("name")
if not operation_name:
print(f"✗ 未返回 operation name")
sys.exit(1)
print(f"✓ 操作名称: {operation_name}")
# 第五步:轮询直至完成
POLL_URL = f"https://generativelanguage.googleapis.com/v1beta/{operation_name}?key={GOOGLE_API_KEY}"
for attempt in range(1, 121):
time.sleep(5 if attempt > 1 else 2)
poll_response = requests.get(POLL_URL, timeout=10)
poll_result = poll_response.json()
if poll_result.get("done"):
print(f"✓ 在 {attempt * 5} 秒内完成")
# 提取视频 URL
try:
video_uri = poll_result["response"]["generateVideoResponse"]["generatedSamples"][0]["video"]["uri"]
except (KeyError, IndexError):
print(f"✗ 响应中无视频数据")
print(json.dumps(poll_result, indent=2)[:500])
sys.exit(1)
# 第六步:下载视频
print(f"⬇️ 正在下载...")
video_response = requests.get(f"{video_uri}&key={GOOGLE_API_KEY}", timeout=120, stream=True)
if video_response.status_code == 200:
output_path = WORKSPACE / f"{TIMESTAMP}_video.mp4"
with open(output_path, "wb") as f:
for chunk in video_response.iter_content(chunk_size=8192):
if chunk:
f.write(chunk)
size_mb = output_path.stat().st_size / (1024 * 1024)
print(f"✓ 视频: {output_path.name} ({size_mb:.1f} MB)")
sys.exit(0)
else:
print(f"✗ 下载失败: {video_response.status_code}")
sys.exit(1)
print("✗ 超时")
sys.exit(1)
PYEOF
WORKSPACE="$HOME/.openclaw/workspace/tibetanProc"
mkdir -p "$WORKSPACE"
TIMESTAMP=$(date +%y%m%d%H%M)
cp ./my_image.jpg "$WORKSPACE/${TIMESTAMP}_input_image.jpg"
import google.generativeai as genai
from pathlib import Path
genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))
model = genai.GenerativeModel("gemini-2.5-flash")
IMAGE_PATH = Path.home() / ".openclaw" / "workspace" / "tibetanProc" / "2604110411_input_image.jpg"
image_file = genai.upload_file(str(IMAGE_PATH), mime_type="image/jpeg")
analysis_prompt = """Analyze this image for cinematic video generation:
1. Main subject and focal point
2. Setting and environment
3. Lighting direction and mood
4. Materials and textures
5. Suggested camera movements (dolly, pan, orbit, zoom, rack focus)
6. Overall energy and pacing"""
response = model.generate_content([analysis_prompt, image_file])
# 保存分析结果
with open(WORKSPACE / "2604110411_prompt.md", "w") as f:
f.write(response.text)
# 读取分析结果
with open(WORKSPACE / "2604110411_prompt.md") as f:
analysis = f.read()
# 添加视频生成指令
enhanced = f"""VIDEO GENERATION PROMPT
Duration: 5 seconds
Quality: High Definition
Frame Rate: 24fps
SCENE ANALYSIS:
{analysis}
MOTION GUIDELINES:
- Smooth, deliberate camera movement
- Enhance visual depth with elegant transitions
- Maintain consistent lighting throughout
- Cinematic color grading
- Focus on visual storytelling
TECHNICAL SPECS:
- Resolution: 1080p minimum
- Aspect Ratio: 16:9
- Format: MP4 (H.264)
"""
with open(WORKSPACE / "2604110411_enhanced_prompt.txt", "w") as f:
f.write(enhanced)
import base64
import requests
# 编码图像
with open(IMAGE_PATH, "rb") as f:
image_b64 = base64.b64encode(f.read()).decode("utf-8")
# 读取增强提示词
with open(WORKSPACE / "2604110411_enhanced_prompt.txt") as f:
prompt = f.read()
# ✅ 正确的载荷结构(v3.0.0)
payload = {
"instances": [{
"prompt": prompt,
"image": {
"bytesBase64Encoded": image_b64, # ← 关键:不可用 "data" 或 "inline_data"
"mimeType": "image/jpeg" # ← 必须存在且拼写准确
}
}]
}
VEO_URL = f"https://generativelanguage.googleapis.com/v1beta/models/veo-3.0-generate-001:predictLongRunning?key={GOOGLE_API_KEY}"
response = requests.post(VEO_URL, json=payload, timeout=60)
result = response.json()
if response.status_code in [200, 202]:
operation_name = result["name"]
print(f"✓ 操作名称: {operation_name}")
else:
print(f"✗ 错误: {result}")
exit(1)
import time
POLL_URL = f"https://generativelanguage.googleapis.com/v1beta/{operation_name}?key={GOOGLE_API_KEY}"
for attempt in range(120): # 最长 10 分钟
time.sleep(5)
poll_response = requests.get(POLL_URL, timeout=10)
poll_result = poll_response.json()
if poll_result.get("done"):
print(f"✓ 在 {(attempt + 1) * 5} 秒内完成")
# 从响应结构中提取视频 URL
video_uri = poll_result["response"]["generateVideoResponse"]["generatedSamples"][0]["video"]["uri"]
print(f"✓ 视频 URL: {video_uri}")
break
progress = poll_result.get("metadata", {}).get("progressPercentage", "?")
print(f" 正在轮询 ({attempt + 1}/120)... {progress}%")
# URL 需附加 API key
download_url = f"{video_uri}&key={GOOGLE_API_KEY}"
video_response = requests.get(download_url, timeout=120, stream=True)
output_path = WORKSPACE / "2604110411_video.mp4"
with open(output_path, "wb") as f:
for chunk in video_response.iter_content(chunk_size=8192):
if chunk:
f.write(chunk)
size_mb = output_path.stat().st_size / (1024 * 1024)
print(f"✓ 视频已下载: {output_path} ({size_mb:.1f} MB)")
{
"name": "models/veo-3.0-generate-001/operations/uiw8bpjdiqbn"
}
{
"name": "models/veo-3.0-generate-001/operations/uiw8bpjdiqbn",
"done": true,
"response": {
"@type": "type.googleapis.com/google.ai.generativelanguage.v1beta.PredictLongRunningResponse",
"generateVideoResponse": {
"generatedSamples": [
{
"video": {
"uri": "https://generativelanguage.googleapis.com/v1beta/files/txg4shogthoc:download?alt=media"
}
}
]
}
}
}
~/.openclaw/workspace/tibetanProc/ ├── 2604110411_input_image.jpg # 原始图像 ├── 2604110411_prompt.md # Gemini 分析结果 ├── 2604110411_enhanced_prompt.txt # 增强后的提示词(含运镜指导) ├── 2604110411_veo_init_response.json # API 初始响应(初始化阶段) └── 2604110411_video.mp4 # ✅ 最终视频
| 错误 | 原因 | 修复方式 |
|---|---|---|
bytesBase64Encoded isn't supported |
字段名不正确 | 必须使用 bytesBase64Encoded(不可用 data、inline_data 或 bytesBase64) |
mimeType isn't supported |
字段名大小写错误 | 必须严格使用 mimeType(驼峰命名法,不可写作 mime_type 或 MimeType) |
No struct value found for field expecting an image |
完全缺失图像字段 | 必须同时提供 bytesBase64Encoded 和 mimeType |
Video generation timeout |
操作耗时超过 10 分钟 | 极罕见;通常在 60–90 秒内完成 |
403 PERMISSION_DENIED 下载失败 |
API key 权限或缺失 | 确保视频下载 URL 中包含 ?key={GOOGLE_API_KEY} |
| 操作 | 耗时 |
|---|---|
| Gemini 分析 | 约 3 秒 |
| Veo 视频生成 | 约 50–90 秒 |
| 视频下载 | 约 2–5 秒 |
| 总计 | 约 60–100 秒 |
| 版本 | 日期 | 变更说明 |
|---|---|---|
| 3.0.0 | 2026-04-11 | ✅ 可用的 REST API —— 修复字段名:改用 bytesBase64Encoded 替代 data |
| 2.0.0 | 2026-04-11 | 记录异步轮询机制(当时尚未生效) |
| 1.0.0 | 初始版本 | 初始设计(仅支持 gRPC,REST 接口不可用) |
已成功验证以下配置:
相关专题
热门下载
相关下载
精品课程
共6课时 | 54.7万人学习
共89课时 | 134.1万人学习
共49课时 | 82.6万人学习
最新文章