使用指南
Veo 3.1 图生视频:通过 API 把一张静帧变成短视频广告
从一张 $0.03 的产品静帧,到一条带原生音频的 9:16 竖版短片,只需 115 秒——在 hiapi 任务 API 上运行完整的 veo-3.1/image-to-video 工作流,包含真实输出、快速档草稿循环和批处理管线。
短视频存在一个残酷的制作算数问题:TikTok 和 Reels 靠发布量取胜,但一条精致的产品短片就可能耗掉一个下午的拍摄、剪辑和音效设计。Google 的 Veo 3.1 图生视频模型(veo-3.1/image-to-video)将这条流水线压缩成两次 API 调用——一张便宜的静帧、一个视频任务——然后返回一条已经混好原生音频的竖版短片。
以下是本管线为本文生成的完整输出。一张 $0.03 的源图,一次 API 调用,等待 115 秒:
把声音打开——落地的闷响、环境低频脉冲和雾气嘶嘶声全部由模型生成。这里没有任何东西经过人工剪辑、调色或音效设计。在本指南中,我们将通过 hiapi 任务 API 端到端地构建出这条短片,然后把同一工作流扩展成批处理管线,用于生产短格式变体。
为什么图生视频是短格式的正确工具
文生视频非常适合探索,但短格式商业内容通常从你已掌控的素材开始:产品照片、包装图、海报帧。图生视频在保持这种视觉身份不变的同时加入运动。对于 TikTok/Reels 格式,veo-3.1/image-to-video 的三个特性尤其重要:
- 输出遵循你输入的画幅。没有
aspect_ratio参数——模型从你提供的图像继承构图。给它一张 9:16 的竖版静帧,你得到一条 9:16 的竖版视频。本文两条短片都精确输出为 1080×1920 和 720×1280,因为源静帧是 9:16。你的构图决策在图像阶段只需做一次。 - 原生音频。每条短片都附带一条根据你的提示词生成的 48 kHz AAC 音轨——拟音、环境声和音乐质感。对于短格式而言,静音自动播放的转化率不如带声音的内容,这省掉了整个剪辑步骤。
- 平台适配分辨率。
720p用于草稿,1080p用于信息流质量的竖版,4k用于短片同时充当其他投放位置的母版。
输入参数结构(已对实时 API 验证)
在撰写本指南前,我们探测了实时端点。参数结构很严格——未知字段会被 400 拒绝,所以不要猜测:
| 字段 | 必填 | 类型 | 值 |
|---|---|---|---|
prompt |
推荐 | string | 运动、镜头和音频指示 |
image_url |
是 | string | 一个可公开访问的图像 URL |
resolution |
是 | string | 720p、1080p、4k |
duration |
是 | integer | 4、6 或 8(秒) |
两个值得提前知道的问题:image_url 是单数——这是单参考模型,不是多图混合器——并且 URL 必须可公开抓取(托管在你自己的 CDN 或对象存储上;签名的 localhost 链接不行)。
第 1 步——生成源静帧
任何 9:16 的图像都可用,包括真实产品照片。我们用 gpt-image-2 以 $0.03 生成了我们的源图,使整个管线保持在一个 API 内:

curl -X POST https://api.hiapi.ai/v1/tasks \
-H "Authorization: Bearer $HIAPI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-image-2/text-to-image",
"input": {
"prompt": "Vertical product hero shot of a chunky retro basketball sneaker in wolf-gray suede with volt yellow laces, floating at a slight tilt above a wet concrete pedestal, dramatic teal-to-amber gradient backdrop, fine mist and dust particles suspended in hard rim light, ultra-sharp commercial product photography, no text, no logos",
"aspect_ratio": "9:16",
"resolution": "1K"
}
}'
好的 i2v 源图的构图规则与你给静物摄影师的规则相同,外加一条:留出运动余量。我们的运动鞋悬浮在基座上方,正是为了让视频模型有一个明显、物理上的动作可做——让鞋子落到石头上。一个凝固在动作中的主体给 Veo 一个可完成的故事;一张静态居中的包装图什么都给不了它,你只会得到漂移镜头的填充画面。
第 2 步——提交视频任务
同一个 /v1/tasks 端点,不同的模型。提示词应同时指导三个通道:主体运动、镜头和音频。
curl -X POST https://api.hiapi.ai/v1/tasks \
-H "Authorization: Bearer $HIAPI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "veo-3.1/image-to-video",
"input": {
"prompt": "The sneaker slowly rotates about 90 degrees as the camera pushes in from a low angle. Dust particles drift through the rim light. The shoe settles onto the wet stone pedestal with a deep, satisfying thud, sending a soft ring of mist rolling off the edges. A warm light sweep travels across the suede texture. Subtle bass-heavy electronic pulse builds in the background with a low whoosh on the landing. Cinematic product commercial, smooth stabilized motion, no text overlays.",
"image_url": "https://your-cdn.example.com/stills/sneaker-916.jpg",
"resolution": "1080p",
"duration": 6
}
}'
响应会立即返回一个任务 ID:
{"code": 200, "data": {"taskId": "tk-hiapi-01KXCTHP6F6VXQ9XZCSCCEEEMM"}, "message": "success"}
注意提示词是按短片播放顺序写的:旋转 → 推近 → 落地 → 光扫,音频提示附在它们所属的时刻(落地时的“闷响”,下方有脉冲)。Veo 会非常字面地遵循提示词中的事件顺序——这正是它可以被脚本化的原因。
第 3 步——轮询并下载
视频任务是异步的。轮询任务直到 status 翻转为 success,然后立即下载输出——该 URL 是带 expireAt 时间戳的临时链接,不是永久存储:
import os, time, requests
API = "https://api.hiapi.ai/v1/tasks"
HEADERS = {"Authorization": f"Bearer {os.environ['HIAPI_API_KEY']}"}
def wait_and_download(task_id: str, out_path: str, timeout_s: int = 900):
deadline = time.time() + timeout_s
while time.time() < deadline:
task = requests.get(f"{API}/{task_id}", headers=HEADERS, timeout=30).json()["data"]
if task["status"] == "success":
url = task["output"][0]["url"] # temp link — expires!
clip = requests.get(url, timeout=120).content
with open(out_path, "wb") as f:
f.write(clip) # persist to your own storage now
return out_path
if task["status"] == "fail":
raise RuntimeError(task.get("error"))
time.sleep(10)
raise TimeoutError(task_id)
在我们的运行中,6 秒 1080p 短片从提交到完成耗时 115 秒。这足够快,可以放在内容管线中而无需在前面加队列。
廉价起草,精修定稿:双层工作流
Veo 3.1 有一个快速档——veo-3.1-fast/image-to-video——具有完全相同的输入结构,每秒价格不到一半。这启用了一种借鉴自摄影的工作流:在烧胶片前先拍宝丽来。在快速档上以 720p 迭代你的运动提示词,只在标准档上重新渲染胜出的提示词。
以下是完全相同提示词和源静帧的快速档草稿(6 秒,720p,$1.50,58 秒完成):
草稿抓住了相同的节拍——旋转、落地、雾气——但纹理细节明显更简单,音频混音更扁平。对于提示词迭代,这就是你需要的全部:你检查的是编排,而不是最终打磨。本文两条短片都是第一次拍摄;快速档就是你确保标准档拍摄是你唯一付费的那次的方法。
扩展到批量生产
短格式策略是一场量级游戏——每个产品你想要 5–10 个变体来测试钩子。因为一切都在一个异步端点上,批处理只是一个循环:先提交所有任务,然后收集。
STILLS = [
("sneaker-916.jpg", "rotates and lands on the pedestal with a deep thud..."),
("bottle-916.jpg", "condensation beads race down the glass as camera orbits..."),
("headphones-916.jpg","earcup unfolds in slow motion, soft click, synth swell..."),
]
task_ids = []
for still, motion in STILLS:
r = requests.post(API, headers=HEADERS, json={
"model": "veo-3.1-fast/image-to-video", # draft tier for the first sweep
"input": {
"prompt": motion,
"image_url": f"https://your-cdn.example.com/stills/{still}",
"resolution": "720p",
"duration": 6,
},
}, timeout=60).json()
task_ids.append(r["data"]["taskId"])
for i, tid in enumerate(task_ids):
wait_and_download(tid, f"draft-{i}.mp4")
先提交后收集很重要:短片在平台侧并发生成,因此十个草稿大约只需要一个草稿的时间,而不是十倍。
费用是多少
根据 hiapi 定价,两个档位都按输出视频秒数计费:
| 模型 | 价格 | 4 秒短片 | 6 秒短片 | 8 秒短片 |
|---|---|---|---|---|
veo-3.1/image-to-video |
$0.57/s | $2.28 | $3.42 | $4.56 |
veo-3.1-fast/image-to-video |
$0.25/s | $1.00 | $1.50 | $2.00 |
本文展示的一切——一张源静帧、一张封面图、一份快速草稿、一条 1080p 最终版——的 API 花费为 $4.98。三份快速草稿加一条标准最终版的工作流,每条成品竖版大约花费 $8,这与一个拍摄日是完全不同的量级。
常见问题
如何控制宽高比? 不能——输出继承输入图像的画幅。对于 TikTok/Reels,在提交前将源静帧生成或裁剪为 9:16。我们的 9:16 静帧精确生成了 1080×1920 输出。
音频真的是生成的吗? 是的。上面两条短片都带有模型生成的 48 kHz AAC 音轨——拟音(落地闷响)、环境声和音乐质感,全部由提示词引导。在提示词中在声音应该发生的时刻描述声音。
生成需要多长时间? 在我们实测的运行中:6 秒/720p 快速档短片 58 秒,6 秒/1080p 标准档短片 115 秒。每条短片预算几分钟,批处理使用先全部提交再收集的模式。
可以用真实产品照片代替生成的静帧吗? 当然可以——这是主要用例。图像只需可通过 URL 公开抓取。保持主体清晰,留出运动余量,并在提示词中描述你想要的运动。
什么时候该为 4k 付费? 当竖版同时充当母版资产时——将 4k 源裁剪用于信息流投放、网页主视觉和付费单元。对于仅信息流交付,1080p 就是平台最终转码的分辨率。
发布你的第一条短片
整个管线就是两次 POST 加一次轮询:静帧进,带声音的竖版广告出,大约两分钟。获取你的 API key,将上面的代码片段指向你最好的产品照片,运行一份 720p 快速档草稿——六秒 $1.50,这是你能委托的最便宜的试镜。完整参数和实时示例在 veo-3.1/image-to-video 模型页面,如果你在比较 i2v 引擎,我们的 Hailuo 2.3 图生视频提示词配方很适合做并排对比。