Vidu Q2 Pro turns a single still image into smooth, cinematic image-to-video with stable motion, clean edges, and consistent lighting. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.
Idle
$0.15per run·~66 / $10
Post-apocalyptic steam locomotive barrels through haunted canyon at night. Black iron engine belches thick white steam, headlamp cuts fog. Tattered zombies claw at red freight cars. Lightning forks illuminate skeletal trees and abandoned wooden trestles. Camera slow tracking alongside train, sparks fly from wheels. Photorealistic CGI, desaturated blue-gray grade, volumetric fog
A cinematic stop-motion style animation, the camera slowly pans forward toward the eerie house. The rider on the horse leans closer, the horse breathes visibly in the cold air, while the masked figure gestures toward the door. Subtle fog drifts across the ground, warm light flickers from the windows, evoking a mysterious and melancholic tone.
A cinematic sci-fi scene inside a cluttered laboratory filled with books, wires, and old machinery. A man in a long coat walks slowly through the warm, dust-filled room toward the glowing window. The camera tracks gently forward, revealing intricate cables on the ceiling and the soft orange light flickering across metal surfaces. Papers rustle, and a faint breeze moves through the space. Atmospheric lighting, volumetric dust, high detail, cinematic depth, 4K quality.
A young boy in a flowing red cape and green jacket stands defiantly on a misty orange-yellow plain, facing a massive, menacing red oni demon with glowing red eyes, sharp horns, and jagged teeth. The demon rears up aggressively, tentacles writhing from its body, while the boy raises his hands in a magical gesture, wind swirling around him. Dynamic camera slowly circles from low angle to high, building tension, in vibrant hand-drawn anime style with bold red and orange hues, ethereal blue accents in the background. Smooth 8-second animation, 1080p, cinematic lighting.
Gothic ruined library under full moon. A pale girl in white uniform reads on velvet throne. Spectral blue phoenix perches on chair, translucent wolf circles her feet. Torn pages orbit like snowflakes. Moonbeam pierces cracked dome, dust motes sparkle. Camera slow dolly from bookshelf to girl’s face, soft parallax on spirits. Photorealistic dark fantasy, cyan-moonlight grade, volumetric god rays
Vidu Q2 Pro Image-to-Video turns a single still image into a smooth, cinematic video. Built for creators who need stable motion, clean edges, and consistent lighting — with optional background music for social-ready clips.
Crisp motion from one frame Generates natural camera moves and subject animation without warping or distortion.
Identity and detail preservation Protects faces, hair, hands, and thin structures throughout the animation.
Layout-aware dynamics Respects depth and parallax for believable foreground/background movement.
Optional background music Auto-add BGM for social-ready clips without post-production.
Motion control Adjust movement amplitude from subtle to dramatic based on your creative needs.
| Parameter | Required | Description |
|---|---|---|
| image | Yes | Reference image to animate (PNG/JPG/WebP) |
| prompt | Yes | Describe desired motion, mood, and camera movement |
| duration | No | Video length in seconds (1–10, default: 4) |
| resolution | No | Output resolution: 540p, 720p, or 1080p |
| movement_amplitude | No | Motion intensity: auto, small, medium, or large |
| bgm | No | Enable background music |
| seed | No | Random seed for reproducibility (-1 for random) |
| Resolution | Duration | Price |
|---|---|---|
| 540p | 1s | $0.04 |
| 540p | 2s | $0.05 |
| 540p | 3s | $0.075 |
| 540p | 4s | $0.10 |
| 540p | 5s | $0.125 |
| 540p | 6s | $0.15 |
| 540p | 7s | $0.175 |
| 540p | 8s | $0.20 |
| 540p | 9s | $0.225 |
| 540p | 10s | $0.25 |
| 720p | 1s | $0.075 |
| 720p | 2s | $0.125 |
| 720p | 3s | $0.175 |
| 720p | 4s | $0.225 |
| 720p | 5s | $0.275 |
| 720p | 6s | $0.325 |
| 720p | 7s | $0.375 |
| 720p | 8s | $0.425 |
| 720p | 9s | $0.475 |
| 720p | 10s | $0.525 |
| 1080p | 1s | $0.275 |
| 1080p | 2s | $0.35 |
| 1080p | 3s | $0.425 |
| 1080p | 4s | $0.50 |
| 1080p | 5s | $0.575 |
| 1080p | 6s | $0.65 |
| 1080p | 7s | $0.725 |
| 1080p | 8s | $0.80 |
| 1080p | 9s | $0.875 |
| 1080p | 10s | $0.95 |
540p: $0.04 for 1s, $0.05 for 2s, then +$0.025 per second
720p: $0.075 for 1s, then +$0.05 per second
1080p: $0.275 for 1s, then +$0.075 per second
Grab a WaveSpeedAI API key, then call POST https://api.wavespeed.ai/api/v3/vidu/image-to-video-q2-pro with your input as JSON. The endpoint returns a prediction id. Start polling the result endpoint around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. On completed, read output values from data.outputs. Examples for Image To Video Q2 Pro below.
set -euo pipefail
: "${WAVESPEED_API_KEY:?Set WAVESPEED_API_KEY}"
REQUEST_BODY=$(cat <<'JSON'
{
"prompt": "A cinematic shot of a city at sunset, soft golden light",
"image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
"duration": 5,
"resolution": "720p",
"bgm": true,
"movement_amplitude": "auto",
"seed": -1
}
JSON
)
# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
-X POST "https://api.wavespeed.ai/api/v3/vidu/image-to-video-q2-pro" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $WAVESPEED_API_KEY" \
-d "$REQUEST_BODY")
TASK=$(printf '%s' "$SUBMIT_RESPONSE" | jq 'if has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "$TASK" | jq -r '.id')
if [ -z "$PREDICTION_ID" ] || [ "$PREDICTION_ID" = "null" ]; then
printf 'Submission response did not contain a prediction id
' >&2
exit 1
fi
RESULT_URL=$(printf '%s' "$TASK" | jq -r '.urls.get // empty')
if [ -z "$RESULT_URL" ]; then
RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/$PREDICTION_ID/result"
fi
# 2. Poll until the prediction finishes.
while true; do
RESPONSE=$(curl --silent --show-error --fail-with-body "$RESULT_URL" \
-H "Authorization: Bearer $WAVESPEED_API_KEY")
RESULT=$(printf '%s' "$RESPONSE" | jq 'if has("data") then .data else . end')
STATUS=$(printf '%s' "$RESULT" | jq -r '.status')
case "$STATUS" in
completed) printf '%s\n' "$RESULT" | jq '.outputs'; break ;;
failed|cancelled|timeout) printf '%s\n' "$RESULT" | jq . >&2; exit 1 ;;
created|processing) sleep 2 ;;
*) printf 'Unexpected status: %s
' "$STATUS" >&2; exit 1 ;;
esac
doneconst submitUrl = "https://api.wavespeed.ai/api/v3/vidu/image-to-video-q2-pro";
const apiKey = process.env.WAVESPEED_API_KEY;
if (!apiKey) throw new Error('Set WAVESPEED_API_KEY');
async function requestJson(url, options = {}) {
const response = await fetch(url, options);
if (!response.ok) throw new Error(await response.text());
return response.json();
}
// 1. Submit the prediction.
const body = await requestJson(submitUrl, {
method: "POST",
headers: {
"Authorization": `Bearer ${apiKey}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"prompt": "A cinematic shot of a city at sunset, soft golden light",
"image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
"duration": 5,
"resolution": "720p",
"bgm": true,
"movement_amplitude": "auto",
"seed": -1
}),
});
const task = body.data ?? body;
if (!task.id) throw new Error("Submission response did not contain a prediction id");
const resultUrl = task.urls?.get ||
`https://api.wavespeed.ai/api/v3/predictions/${task.id}/result`;
// 2. Poll until the prediction finishes.
while (true) {
const resultBody = await requestJson(resultUrl, {
headers: { "Authorization": `Bearer ${apiKey}` },
});
const result = resultBody.data ?? resultBody;
if (result.status === "completed") {
console.log(result.outputs);
break;
}
if (["failed", "cancelled", "timeout"].includes(result.status)) throw new Error(JSON.stringify(result));
if (!["created", "processing"].includes(result.status)) throw new Error("Unexpected status: " + result.status);
await new Promise(resolve => setTimeout(resolve, 2000));
}import json
import os
import time
from urllib.request import Request, urlopen
api_key = os.environ["WAVESPEED_API_KEY"]
headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}
payload = {
"prompt": "A cinematic shot of a city at sunset, soft golden light",
"image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
"duration": 5,
"resolution": "720p",
"bgm": True,
"movement_amplitude": "auto",
"seed": -1
}
def request_json(url, data=None):
request = Request(url, data=data, headers=headers, method="POST" if data else "GET")
with urlopen(request) as response:
return json.load(response)
# 1. Submit the prediction.
body = request_json("https://api.wavespeed.ai/api/v3/vidu/image-to-video-q2-pro", json.dumps(payload).encode())
task = body.get("data", body)
if not task.get("id"):
raise RuntimeError("Submission response did not contain a prediction id")
result_url = task.get("urls", {}).get("get") or f"https://api.wavespeed.ai/api/v3/predictions/{task['id']}/result"
# 2. Poll until the prediction finishes.
while True:
result_body = request_json(result_url)
result = result_body.get("data", result_body)
status = result.get("status")
if status == "completed":
print(result.get("outputs", []))
break
if status in {"failed", "cancelled", "timeout"}:
raise RuntimeError(result)
if status not in {"created", "processing"}:
raise RuntimeError(f"Unexpected status: {status}")
time.sleep(2)Image To Video Q2 Pro is a Vidu model for video generation from images, exposed as a REST API on WaveSpeedAI. Vidu Q2 Pro turns a single still image into smooth, cinematic image-to-video with stable motion, clean edges, and consistent lighting. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing. You can call it programmatically or try it from the playground above.
POST your input parameters to the model's REST endpoint (shown in the API tab of this playground) with your WaveSpeedAI API key in the Authorization header. Submission returns a prediction ID. Poll the result endpoint starting around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. The playground generates production-oriented Python, JavaScript, and cURL examples with timeouts, transient-error handling, and safe GET retries. Full request/response shape is documented at https://wavespeed.ai/docs/docs-api/vidu/vidu-image-to-video-q2-pro.
Image To Video Q2 Pro starts at $0.15 per run. That figure is the base price — the final charge scales with the parameters you set in the form (output size, length, count, references, or whatever knobs this model exposes), so a higher-quality or larger output costs more than a minimal one. The exact cost for your current input is shown live next to the Generate button before you submit, and the actual per-call charge is recorded on the prediction afterwards.
Key inputs: `prompt`, `image`, `resolution`, `duration`, `seed`, `bgm`. The full JSON schema (types, defaults, allowed values) is rendered above the Generate button and mirrored in the API reference at https://wavespeed.ai/docs/docs-api/vidu/vidu-image-to-video-q2-pro.
Median end-to-end generation time on WaveSpeedAI is around 81 seconds per request, based on recent successful runs. Queue time varies with global demand; live status is visible in the prediction record.
Commercial usage rights depend on the model's license, set by its provider (Vidu). The license summary appears on the model card above; see WaveSpeedAI's Terms of Service for platform-level conditions.