Loading...
Loading...
Animate a still image into video with Gemini Omni 1.1 Flash. The source image becomes the first frame and drives the generated motion.
No output yet
Run the model to see generated results.
import requests
result = requests.post(
'https://api.e2x.ai/v1/jobs/submit',
headers={
'Authorization': f'Bearer {API_KEY}',
'Content-Type': 'application/json'
},
json={
'model': 'google/omni-1.1-flash/image-to-video',
'input': {}
}
)import time
job_id = result.json()['jobId']
while True:
response = requests.get(
f'https://api.e2x.ai/v1/jobs/{'{job_id}'}',
headers={'Authorization': f'Bearer {'{API_KEY}'}'}
)
data = response.json()['data']
if data['status'] == 'completed':
print('Done!', data['outputs'][0]['url'])
break
elif data['status'] == 'failed':
raise Exception(f"Job failed: {'{'}data['error']['message']{'}'}")
time.sleep(2)按时长和分辨率估算每次生成的成本。您只需为实际运行的部分付费。
Gemini Omni 1.1 Flash 于 2026年8月27日在 Google 正式发布。它属于 Gemini 家族,不是 Veo,我们把它的 image-to-video capability 开放为 google/omni-1.1-flash/image-to-video。我们按成片视频的每一秒计费——720p 下每秒 $0.09,对应的标价是 $0.15,因为四条 capability 都吃同一个常年 40% 的折扣。默认的 8 秒片段是 $0.72。必填字段:prompt 和 image_url。
在发出第一个 request 之前,先弄清楚那张静帧到底是什么。它是一纸合同。它定下第一帧,连带定下取景、镜头、色调、主体,以及画面里已经存在的每一处瑕疵。您的 prompt 只拿得到之后那几秒,拿不到之前的任何东西。
这里几乎每一个平淡的结果,都能追到同一个错误:prompt 描述的是那张照片,而不是那个变化。请点名什么在动。请点名摄影机往哪儿走。
| 片段长度 | 720p 价格 |
|---|---|
| 4 秒 | $0.36 |
| 6 秒 | $0.54 |
| 8 秒(默认) | $0.72 |
| 10 秒 | $0.90 |
分辨率会按倍数缩放这个费率:360p 是 0.33×(每秒 $0.0297),1080p 是 1.5×($0.135),4K 是 2×($0.18)。一次 4 秒的 360p 试跑是 $0.1188——这是判断您那张静帧到底动不动得起来的最便宜方式。
两端固定、中间交给模型?Omni 1.1 Flash start-end-frame-to-video。同一个主体从多个角度拍过、要在整份镜头表里保持一致?Omni 1.1 Flash reference-to-video。完全没有素材?Omni 1.1 Flash text-to-video 那一页承载了完整的价格论证。
请把这个 job 当作一次续写,而不是一次解读。模型把您的静帧当成第一帧,然后在它之后每秒发明 24 个说得通的帧,全部锚定在您交出去的东西上。这个锚定就是价值所在:一张签过字的主视觉能保持在品牌调性上,因为没有人把它重摇了一遍。
它同时也是约束。画面越杂,模型在一切都在变的过程中要维持连贯的物件就越多,而连贯恰恰是这一代的弱点。Google 的模型卡就是这么写的:*「在编辑全程保持完全一致、生成包含复杂运动的场景,或渲染完全准确的文字,仍然是一项挑战。」*招牌会糊。人群里的脸会翻搅。干净背景上的一个主体撑过 10 秒,比杂乱画面撑过 4 秒更容易。
裁切请您自己来。 输出只有 16:9 或 9:16——没有方图,没有 4:5,没有超宽。把一张 4:5 的竖幅塞进 16:9 的 job,总得有一边让步:要么模型在两侧填进没人拍过的内容,要么构图为了迁就比例而漂移。反正每秒都是 $0.09。先裁,趁这个决定还不要钱的时候。
别靠放大硬凑 4K。 源分辨率决定了输出诚实地能承载多少细节。一张 640 像素宽的缩略图渲成 1080p,只是同样的细节换了个更大的文件,费率却是 1.5 倍。
给运动留出去处。 主体上方要有头顶空间,车前方要有路。裁得太紧,什么都动不了,除非被挤出画外——这也是片子看起来像一张晃动的照片的常见原因。
在控制台生成一把 key,把它留在服务端。我们的 pipeline 会自己去取 image_url,所以它必须能从公网访问到——CDN 或对象存储上的一个 HTTPS 地址,绝不能是本地路径、localhost,或者一个需要登录才能打开的 URL。签名 URL 可以,但有效期请给足:job 大约跑 4 分钟,一个 60 秒的链接会先一步失效。
curl -X POST https://api.e2x.ai/v1/jobs/submit \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "google/omni-1.1-flash/image-to-video",
"input": {
"prompt": "蒸汽开始从水壶嘴上卷起并向右飘去。摄影机沿着壶柄缓慢推近。厨房的低鸣,水壶开始发出滴答声。画面里没有别的东西在动。",
"image_url": "https://cdn.example.com/stills/copper-kettle-16x9.jpg",
"aspect_ratio": "16:9",
"resolution": "720p",
"duration": "8"
}
}'
您会拿到一个 job ID。要么去 poll 它,要么给我们一个 webhookUrl,把轮询整个跳过:
const headers = {
Authorization: `Bearer ${process.env.E2X_API_KEY}`,
"Content-Type": "application/json",
};
const start = await fetch("https://api.e2x.ai/v1/jobs/submit", {
method: "POST",
headers,
body: JSON.stringify({
model: "google/omni-1.1-flash/image-to-video",
input: {
prompt:
"她转向摄影机,围巾被风扬起。固定机位。海鸥,远处的浪声。",
image_url: "https://cdn.example.com/stills/portrait-9x16.png",
aspect_ratio: "9:16",
resolution: "360p",
duration: "10",
},
}),
}).then((r) => r.json());
const { jobId } = start.data;
for (let tick = 0; tick < 360; tick++) {
const job = await fetch(`https://api.e2x.ai/v1/jobs/${jobId}`, { headers })
.then((r) => r.json());
if (job.data.status === "completed") {
await archive(job.data.outputs[0].url); // 把它复制到一个永久的地方
break;
}
if (["failed", "cancelled"].includes(job.data.status)) {
throw new Error(job.data.error?.message ?? job.data.status);
}
await new Promise((r) => setTimeout(r, 5000));
}
一个 job 会先报 pending,然后 processing,最后是 completed、failed 或 cancelled。有两处 schema 细节常常咬人:duration 和 resolution 是字符串,所以要发 "10" 而不是 10;另外这里没有音频开关,因为声音是跟画面一起生成的,并由您的 prompt 指挥。字段定义始终以机器可读规格为准。
只写会变的部分。主体、光线和构图是跟着文件一起来的;重复它们,等于把模型本可以花在运动上的注意力花掉了。什么运动都不说,您会拿到一个几乎静止、只有轻微漂移的画面,价钱一分不少。
一个动作,点名。 蒸汽升起。一扇门向内摆开。头发扬起。挑出那个真正要紧的动作,让其余的保持不动——把「保持不动」明说出来,比听上去更有用。
一条摄影机指令。 「缓慢推近」「固定机位」「手持向左轻移」。朴素的语法胜过一整段摄影学论述,而没说清楚的摄影机就成了模型的决定。
底下那层声音。 房间底噪、车流,或者某一个具体音效。沉默不是默认值;您不指定,混音就会被替您编出来。prompt 长度上限是 50,000 个字符,所以长度从来不是限制——精确才是。我们的 Gemini Omni prompt 指南在措辞上讲得更深。
这话由我们说出来,好过您从账单上读到。Veo 3.1 Fast image-to-video 跑在同一个平台上,每秒 $0.01——比本页这个 endpoint 低九倍。
| Endpoint | 8 秒片段 | 什么时候选它 |
|---|---|---|
| Veo 3.1 Fast image-to-video | $0.08 | 一张静帧、一段片子,后面没有东西依赖它 |
| Omni 1.1 Flash image-to-video | $0.72 | 您需要 10 秒、一轮 360p 草稿,或者这个镜头要跟别的镜头并排 |
| Veo 3.1 Fast text-to-video | $0.08 | 那张静帧值不了 $0.64 的活儿 |
价格与产品条款可能随时间变化;在做出采购决定前,请核对各家提供商的当前价格。Google 的 Batch 或 Flex 价格在调度、可用容量和处理条件上均有所不同,因此与标准的按需 API request 并不直接等价,已从本对比中排除。这是一次限定范围的对比,并非声称 E2X 在任何配置下都是全球最便宜的选择。
这话请当真。一张照片,动一次,那活儿属于 Veo。这里的溢价只在三种情况下赚得回来:您的剪辑需要 10 秒而 Veo 到 8 秒就停;您想按每秒 $0.0297 打草稿;或者这段片子必须属于一整组。其他让静帧动起来的方式在 image-to-video 分类里,旁边就是我们的模型目录。
输出是 24 fps,单次生成 3 到 10 秒,每一帧都带 SynthID watermark,链条上没有任何一方能把它关掉。结果 URL 是临时的——请在完成回调里就把文件归档。一个明天取不回来的链接,等于一次要买两遍的渲染。
有一条规则是专门因为您上传了照片才适用的:在欧洲经济区、瑞士和英国,Google 会拦截含有未成年人的源静帧,某些可辨识的个人也在内。另外,英语仍是 Google 唯一评测过的 prompt 语言。我们关于 Gemini Omni 1.1 Flash 的发布说明讲了相对我们仍在运行的上一代还改了什么,后者在上游将于 2026年9月30日弃用。
9 美分买 720p 的一秒。默认片段是 8 秒,所以 $0.72;上限 10 秒是 $0.90。这个费率是 $0.15 标价打 4 折之后的结果,读自我们 2026年8月28日的实时目录。分辨率会改变倍数——360p 0.33×,1080p 1.5×,4K 2×。
大多数单张静帧用 Veo——每秒 $0.01 对 $0.09,8 秒是 $0.08 对 $0.72。当您需要 10 秒、当一轮 360p 草稿整体上更省钱,或者当这段片子必须跟同一主体做出的其他片子对得上时,再回来。
只有 16:9 和 9:16。请在提交之前把源图裁成目标比例;否则模型会自行调和这个不匹配,而您可能会丢掉已经通过的那部分构图。
任何我们的 pipeline 能通过公网 HTTPS 访问到的地方——CDN、S3 或 GCS 存储桶、您自己的 web 服务器。本地路径、localhost 以及任何需要鉴权的地址都会失败。签名 URL 可用,前提是它的有效期要宽裕地覆盖一个 job 的 4 分钟。
通常是因为 prompt 在复述这张图像,而不是在指挥它。静帧已经把主体和取景定死了;既没说运动也没说摄影机运动,模型就没有东西可以着手。请把它改写成一个动作加一条摄影机指令。
带,与画面原生一同生成并保持同步。这里没有 has_sound 字段,也没有静音模式,所以请在 prompt 里描述环境音。音频事后无法编辑——一处改动就意味着再生成一次。
有。对欧洲经济区、瑞士和英国的用户,Google 会拦截含有未成年人以及某些可辨识个人的源静帧——这是它的政策,在每一家提供商处都同样执行。输出还会带上隐形的 SynthID watermark,所以请按「带标签的 AI 素材」来做规划。