HiAPI
Blog

Guida all'uso

Vidu Q4 Preview image-to-video: trasforma fermo immagine di prodotto in clip video brevi 4K

Oct 19, 2026
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:

  1. 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.
  2. resolution imposta il lato corto, non il lato lungo. Su un'immagine verticale, 1080p restituisce 1080×1918, 720p restituisce 720×1278. Usare 4k su un fermo immagine verticale significa un colosso largo 2160 (qui 2160×3836) — pianifica budget e codifica di conseguenza.
  3. 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.
  4. image_url è singolare. Passare reference_image_urls viene 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:

  1. Prepara un primo fotogramma per ogni beat — verticale (9:16) per i video brevi, perché l'orientamento è bloccato nell'immagine.
  2. Invia ogni beat come attività asincrona indipendente — un POST /v1/tasks per ciascuno; non bloccare gli altri mentre il primo attende di completarsi.
  3. Esegui il polling di ogni taskId fino a success, scarica l'mp4 (dall'URL di output).
  4. 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": 99 restituisce invalid input: duration: maximum: got 99, want 16, senza taskId — 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.

Inizia a creare con artefatti IA persistenti

Ottieni la tua chiave API e chiama modelli di immagini, video e audio tramite un'unica API basata sui task.

Leggi la documentazione API