Guida all'uso
Vidu Q4 Preview image-to-video: trasforma fermo immagine di prodotto in clip video brevi 4K
Hai già un fermo immagine: un'immagine di prodotto, un fotogramma hero di prodotto, un ritratto. Per i video brevi, il compito è farlo muovere: un beat verticale di 4–6 secondi, con un po' di movimento di camera e una traccia audio, poi sovrapposto in una sequenza hook / corpo / CTA. vidu-q4-preview/image-to-video sull'API hiapi è costruito esattamente per questo. Inserisci un primo fotogramma e ricevi una clip da 3–16 secondi, fino a 4K, con traccia audio nativa.
Questa è una pipeline di produzione end-to-end, non una galleria di prompt: prepara i primi fotogrammi, genera in batch tre clip asincrone, rifinisci il beat 4K, esporta H.264 per il web. Ogni clip, ogni numero e ogni dettaglio dello schema qui sotto provengono da una vera esecuzione del 2026-10-19 — tre clip generate e incorporate inline, che puoi guardare direttamente.
Se vuoi solo prompt di ripresa pronti da copiare e incollare, leggi Ricette di prompt per Vidu Q4 Preview image-to-video. Se il tuo materiale è un kit di brand (più immagini di riferimento più un campione audio), quello è reference-to-video — un compito diverso, che usa un endpoint diverso. Questa pagina riguarda il caso del singolo fermo immagine.
Cosa accetta realmente l'endpoint image-to-video
Ecco il contratto di input, riprodotto in tempo reale durante questa esecuzione (usando solo valori non validi, quindi il probing non è mai costato un centesimo):
| Campo | Obbligatorio | Valori |
|---|---|---|
model |
Sì | vidu-q4-preview/image-to-video |
prompt |
Sì | Descrizione del movimento |
image_url |
Sì | URL di una singola immagine di primo fotogramma |
resolution |
No | 540p · 720p · 1080p · 2k · 4k |
duration |
No | Secondi interi, 3–16 |
Quattro comportamenti determinano come costruisci la pipeline, e tutti e quattro sono facili da sbagliare:
- Non esiste un campo
aspect_ratio. Se lo passi viene rifiutato direttamente (invalid input: <root>: additional properties 'aspect_ratio' not allowed). La clip eredita l'orientamento dal primo fotogramma — un fermo immagine 9:16 produce una clip 9:16. L'orientamento si decide quando realizzi il fermo immagine, non al momento della chiamata, quindi per i video brevi devi stabilire il verticale fin dall'inizio. resolutionimposta il lato corto, non il lato lungo. Su un'immagine verticale,1080prestituisce 1080×1918,720prestituisce 720×1278. Usare4ksu un fermo immagine verticale significa un colosso largo 2160 (qui 2160×3836) — pianifica budget e codifica di conseguenza.- Ogni clip ha una traccia audio, anche senza riferimento audio. Tutti e tre gli output avevano una traccia AAC stereo a 48 kHz, guidata dal lessico sonoro nel prompt. Pianifica se tenerla o silenziarla in post; non manca mai.
image_urlè singolare. Passarereference_image_urlsviene rifiutato (additional properties 'reference_image_urls' not allowed) — quell'array appartiene a reference-to-video. Un fermo immagine in ingresso, una clip in uscita.
Quest'ultimo punto è il vero bivio: se devi bloccare insieme più angolazioni di prodotto, ti serve reference-to-video. Se hai una buona inquadratura, image-to-video è più semplice ed economico.
Panoramica della pipeline
Una sequenza di video brevi non è altro che N animazioni indipendenti da singolo fotogramma, quindi l'intera cosa si parallelizza in modo pulito:
- Prepara un primo fotogramma per ogni beat — verticale (9:16) per i video brevi, perché l'orientamento è bloccato nell'immagine.
- Invia ogni beat come attività asincrona indipendente — un
POST /v1/tasksper ciascuno; non bloccare gli altri mentre il primo attende di completarsi. - Esegui il polling di ogni
taskIdfino asuccess, scarica l'mp4 (dall'URL di output). - Rifinisci il beat 4K, ricodifica HEVC→H.264, concatena o mantieni separati, esporta.
Passo 1 — Prepara i primi fotogrammi
Poiché sia l'orientamento sia il lato corto derivano dal fermo immagine, la scelta dell'inquadratura determina la clip. Per questa esecuzione ho generato due fermi immagine 9:16 con gpt-image-2/text-to-image: una foto di prodotto in studio e un ritratto lifestyle. Ecco la foto di prodotto da cui è partito il nostro hook:

Qui sotto la stessa inquadratura animata in 4K — lento push-in, un fascio di luce che attraversa il vetro:
Il prompt che l'ha prodotta (scritto ed eseguito per questo articolo):
Animate the first frame into a cinematic short-form hook: a slow push-in toward
the amber serum bottle while a soft beam of light sweeps across the glass from
left to right, catching the condensation droplets so they glint. The out-of-focus
eucalyptus leaves behind drift a few millimetres. Unhurried, premium motion.
Subtle ambient whoosh and a soft chime as the light reaches the bottle.
Nota che il prompt descrive solo movimento e suono — non ripete mai cos'è l'oggetto. Il fermo immagine ha già fissato il soggetto; a image-to-video serve solo dirgli come dovrebbe muoversi e come dovrebbe suonare.
Passo 2 — Invia, esegui il polling e scarica un beat
La chiamata è un'unica attività asincrona. Invia:
curl -s -X POST https://api.hiapi.ai/v1/tasks \
-H "Authorization: Bearer $HIAPI_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"model": "vidu-q4-preview/image-to-video",
"input": {
"prompt": "Animate the first frame into a cinematic short-form hook ...",
"image_url": "https://your-storage.example.com/still-product.jpg",
"resolution": "4k",
"duration": 4
}
}'
# -> {"data": {"taskId": "tk-hiapi-01M597ARAKTTJ9YWRPEXPBAYHJ"}}
Poi esegui il polling dell'attività fino allo stato terminale e scarica il risultato:
curl -s https://api.hiapi.ai/v1/tasks/$TASK_ID \
-H "Authorization: Bearer $HIAPI_TOKEN"
# in progress -> {"data": {"status": "processing"}}
# done -> {"data": {"status": "success",
# "output": [{"url": "https://.../out.mp4", "expireAt": ...}]}}
Due cose della risposta reale vale la pena sapere:
- L'URL di output è temporaneo. Porta un
expireAt, quindi scarica subito i byte su disco o nel tuo storage — non fare hotlink nella pagina. - I valori non validi falliscono alla validazione, prima di qualsiasi addebito. Inviare
"duration": 99restituisceinvalid input: duration: maximum: got 99, want 16, senzataskId— che è esattamente come il limite 3–16 sopra è stato confermato gratuitamente. Cattura questo 400 sul client ed esponilo; significa che la richiesta è stata rifiutata, non che l'attività è fallita a metà rendering.
Passo 3 — Genera in batch hook, corpo e CTA
Poiché ogni beat è un fermo immagine → un'attività, li lanci tutti insieme ed esegui il polling insieme, invece di eseguire una catena bloccante. In questa esecuzione tutti e tre sono stati inviati in una volta; i beat 720p e 1080p sono tornati in pochi minuti, l'hook 4K qualche minuto dopo — che è esattamente il motivo per cui invii in modo asincrono invece di chiamare in serie aspettando.
Il beat del corpo lifestyle, animato per sei secondi dal fermo immagine del ritratto a 1080p:
Animate the first frame into a lifestyle short-form beat: a gentle parallax orbit
around the woman as she turns her face a few degrees toward the window light and
her soft smile widens slightly. Loose strands of hair sway in a faint breeze; the
blurred plant leaves behind shift gently. Warm, natural, editorial motion with no
jump cuts. Soft airy room tone.
Il beat della end-card CTA, di nuovo sul fermo immagine di prodotto a 720p per quattro secondi — piccolo, economico, sufficiente per una card di chiusura:
Animate the first frame into a clean end-card beat: the serum bottle rotates slowly
and settles to a confident three-quarter angle as the light steadies. Minimal,
product-forward motion that holds on the bottle. A soft sustained ambient tone that
resolves cleanly.
Un ciclo batch minimo assomiglia a questo — invia tutti i beat, raccogli gli ID delle attività, poi esegui il polling:
import requests, time
BEATS = [
{"name": "hook", "image_url": PRODUCT_STILL, "resolution": "4k", "duration": 4, "prompt": HOOK},
{"name": "body", "image_url": PORTRAIT_STILL, "resolution": "1080p", "duration": 6, "prompt": BODY},
{"name": "cta", "image_url": PRODUCT_STILL, "resolution": "720p", "duration": 4, "prompt": CTA},
]
H = {"Authorization": f"Bearer {TOKEN}", "Content-Type": "application/json"}
# submit all at once -- do not block between beats
tasks = {}
for b in BEATS:
r = requests.post("https://api.hiapi.ai/v1/tasks",
headers=H, json={"model": "vidu-q4-preview/image-to-video",
"input": {k: b[k] for k in ("prompt", "image_url", "resolution", "duration")}})
tasks[b["name"]] = r.json()["data"]["taskId"]
# poll each saved taskId to a terminal state; never resubmit
done = {}
while len(done) < len(tasks):
for name, tid in tasks.items():
if name in done:
continue
t = requests.get(f"https://api.hiapi.ai/v1/tasks/{tid}", headers=H).json()["data"]
if t["status"] == "success":
done[name] = t["output"][0]["url"]
elif t["status"] == "fail":
raise RuntimeError(f"{name} failed: {t.get('error')}")
time.sleep(15)
Conserva gli ID delle attività. Se la rete cade a metà polling, riesegui il polling degli ID salvati — non reinviare mai, altrimenti pagherai due volte lo stesso beat.
Passo 4 — Rifinitura 4K, esportazione H.264 per il web
L'hook 4K viene restituito come HEVC (H.265), Main 10, 2160×3836 — un vero master 4K verticale. HEVC non riproduce in modo affidabile inline nei browser, quindi ricodifica in H.264 per la distribuzione web:
# 4K HEVC master -> H.264 web export (downscaled to a 1080-wide delivery copy)
ffmpeg -i hook_4k.mp4 -vf "scale=1080:-2" \
-c:v libx264 -preset medium -crf 20 -pix_fmt yuv420p \
-c:a aac -b:a 128k -movflags +faststart hook_web.mp4
I beat 1080p e 720p tornano già in H.264, quindi non hanno bisogno di ricodifica — solo un remux con -movflags +faststart, così iniziano a riprodurre prima del download completo. Mantieni l'HEVC largo 2160 come master d'archivio, distribuisci l'H.264 ridimensionato alla pagina; è quella la clip hook che riproduce in cima al passo 1.
Da qui, o esegui concat dei tre beat in un unico video breve verticale, oppure mantienili come asset separati se la tua piattaforma vuole caricare hook, corpo e CTA separatamente.
Quanto costa davvero un video breve a tre beat
Il prezzo è al secondo, addebitato tramite il fattore duration e determinato da resolution (verificato in questa esecuzione rispetto a /api/pricing in tempo reale):
| Risoluzione | Prezzo / secondo |
|---|---|
| 540p | $0.0515 |
| 720p | $0.109 |
| 1080p | $0.1375 |
| 2K | $0.2175 |
| 4K | $0.446 |
Per il video breve a tre beat esatto qui sopra:
| Beat | Risoluzione | Durata | Costo |
|---|---|---|---|
| Hook | 4K | 4s | $1.784 |
| Corpo | 1080p | 6s | $0.825 |
| CTA | 720p | 4s | $0.436 |
| Totale video | 14s | $3.045 |
Aggiungendo $0.03 ciascuno per i due primi fotogrammi gpt-image-2, il video breve finito costa circa $3.11 da generare. L'hook 4K da solo rappresenta il 59% della fattura. Portando l'hook a 1080p, i tre beat scendono a circa $1.81 in totale; il premio 4K è una scelta che fai per un beat che lo merita — la rivelazione hero — mentre la end-card CTA a 720p è indistinguibile alla velocità con cui un pollice scorre. La ripartizione completa per ogni modello è nella pagina prezzi di hiapi.
Domande frequenti
Posso forzare il 9:16 nella richiesta? No — non esiste un campo aspect_ratio, e se lo passi viene rifiutato. L'orientamento è ereditato dal primo fotogramma, quindi realizza o ritaglia un fermo immagine verticale prima della chiamata.
Perché la mia clip ha dell'audio che non ho richiesto? Vidu Q4 Preview emette una traccia audio nativa su ogni clip, suggerita dal lessico sonoro nel prompt. Se vuoi il silenzio, silenzia quella traccia in post.
La mia clip 4K non riproduce inline — il file è corrotto? È a posto; il 4K viene restituito come HEVC/H.265, che alcuni browser non rendono inline. Ricodifica in H.264 come mostrato nel passo 4.
Posso passare più angolazioni di prodotto in una sola chiamata? Non su questo endpoint — image_url è un singolo fotogramma, e reference_image_urls qui viene rifiutato. Riferimenti multipli (e audio) sono l'endpoint reference-to-video.
Quanto può durare un beat? Fino a 16 secondi per clip (lo schema imposta il limite di duration a 16). Per lavori più lunghi, genera più beat e concatenali.
Come controllo il movimento di camera? Descrivilo nel prompt — push-in, orbita parallattica, fermo immagine — come fanno i tre prompt sopra. Per un catalogo più approfondito del linguaggio di ripresa, vedi i nostri appunti su movimenti di camera cinematografici per video AI.
Inizia a far muovere i tuoi fermi immagine
Se hai una buona inquadratura, hai una clip video breve. Punta image_url su di essa, scegli la risoluzione che corrisponde al ruolo del beat, lascia che il batch giri. Consulta lo schema di input completo e gli esempi live nella pagina del modello Vidu Q4 Preview image-to-video, oppure usa la guida rapida di hiapi per collegare i cicli di invio e polling al tuo stack.
Articoli correlati
Vedi tutti gli articoli →-
Guida all'uso
Guida introduttiva a seedream-5.0-pro/image-to-image: capacità, prezzi e punti chiave di integrazione
Limiti di capacità, modalità di fatturazione e pratiche di integrazione ingegneristica del modello di editing immagini di ByteDance
-
Guida all'uso
Guida pratica al text-to-image con seedream-5.0-pro: limiti di capacità, integrazione API e controllo dei costi
Prospettiva operativa per sviluppatori: dai punti chiave sui parametri alla stima di costo di $0,05 per immagine
-
Guida all'uso
Guida introduttiva a Hailuo 2.3 Fast image-to-video: limiti delle capacità, prezzi e pratiche di integrazione
Selezione e integrazione del modello MiniMax image-to-video per sviluppatori