使用ガイド
Vidu Q4 Preview 画像から動画生成:商品の静止画を4Kショート動画クリップに変える
静止画はすでに手元にある——商品画像、メインビジュアルの1コマ、ポートレート。ショート動画での仕事は、それを動かすことだ。4〜6秒の縦型ビートに、少しのカメラモーションと音声トラックを加え、フック/ボディ/CTAのシーケンスとして重ねていく。hiapi API 上の vidu-q4-preview/image-to-video はまさにそのために作られている。最初のフレームを1枚入力すると、3〜16秒、最大4K、ネイティブ音声トラック付きのクリップが返ってくる。
これはプロンプトのギャラリーではなく、エンドツーエンドの制作パイプラインだ。最初のフレームを用意し、3つの非同期クリップを一括生成し、4Kビートを仕上げ、ウェブ用のH.264として書き出す。以下の各クリップ、各数値、各スキーマの詳細はすべて2026年10月19日の実際の実行に基づいている——3つのクリップは生成済みでインライン表示されているので、そのまま視聴できる。
コピー&ペーストできるショットプロンプトだけが欲しい場合は、Vidu Q4 Preview 画像から動画生成プロンプトレシピをお読みください。素材がブランドキット(複数の参照画像と1つの音声サンプル)である場合は、それは参照から動画生成です——別のタスクであり、別のエンドポイントを使います。このページは単一の静止画の場合について説明しています。
画像から動画生成エンドポイントが実際に受け付けるもの
以下は入力仕様で、今回の実行中にリアルタイムで再検証したものだ(無効な値のみを使用したため、検証で1円もかかっていない):
| フィールド | 必須 | 値 |
|---|---|---|
model |
はい | vidu-q4-preview/image-to-video |
prompt |
はい | 動きの説明 |
image_url |
はい | 単一の最初のフレーム画像URL |
resolution |
いいえ | 540p · 720p · 1080p · 2k · 4k |
duration |
いいえ | 整数秒、3〜16 |
パイプラインの組み立て方を決める4つの挙動があり、この4点はいずれも間違えやすい:
aspect_ratioフィールドは存在しない。 渡すと即座に拒否される(invalid input: <root>: additional properties 'aspect_ratio' not allowed)。クリップは最初のフレームから向きを継承する——9:16の静止画は9:16のクリップを生む。向きは静止画を作る時点で決まるのであって、呼び出し時ではない。だからショート動画を作るなら、最初から縦型で決めておく必要がある。resolutionが設定するのは短辺であり、長辺ではない。 縦型画面では、1080pは1080×1918を返し、720pは720×1278を返す。縦型静止画で4kを使うと幅2160の巨大なものになる(ここでは2160×3836)——予算とエンコードもそれに合わせて計画すること。- すべてのクリップに音声トラックが付く。 音声参照がなくてもだ。3つの出力すべてに48 kHzのステレオAAC音声トラックが付き、プロンプト内の音声語彙によって駆動される。残すのか後でミュートするのかを計画しておくこと。決して欠けることはない。
image_urlは単数形だ。reference_image_urlsを渡すと拒否される(additional properties 'reference_image_urls' not allowed)——その配列は参照から動画生成に属する。静画1枚を入力し、クリップ1本を出力する。
最後の点が本当の分かれ道だ。複数の商品アングルを固定して揃える必要があるなら、必要なのは参照から動画生成だ。良い画面が1枚あるなら、画像から動画生成のほうがシンプルで安価だ。
パイプラインの概要
ショート動画のシーケンスは結局のところN個の独立した単一フレームアニメーションなので、全体はきれいに並列化できる:
- 各ビートごとに最初のフレームを1枚用意する——ショート動画は縦型(9:16)で。向きは画面に固定されるため。
- 各ビートを独立した非同期タスクとして送信する——1ビートにつき1回の
POST /v1/tasks。最初の1つが完了するまで他をブロックしないこと。 - 各
taskIdをsuccessまでポーリングし、mp4をダウンロードする(出力URLから)。 - 4Kビートを仕上げ、HEVC→H.264に再エンコードし、連結するか分離したままにして書き出す。
ステップ1——最初のフレームを用意する
向きも短辺も静止画から決まるので、画面の選択がクリップを決める。今回の実行では gpt-image-2/text-to-image で9:16の静止画を2枚生成した:スタジオの商品画像1枚と、ライフスタイルのポートレート1枚。これがフックの起点となる商品画像だ:

以下は同じ画面を4Kでアニメーション化したもの——ゆっくりと寄り、光の帯がガラスを横切る:
これを生成したプロンプト(本記事のために執筆・実行):
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.
プロンプトが記述しているのは動きと音だけであることに注意——物体が何であるかを繰り返し述べることは決してない。静止画がすでに主体を固定しているので、画像から動画生成はそれをどう動かし、どう聞こえるようにするかだけを伝えられればよい。
ステップ2——1つのビートを送信、ポーリング、ダウンロードする
呼び出しは単一の非同期タスクだ。送信:
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"}}
次にタスクが終態になるまでポーリングし、結果をダウンロードする:
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": ...}]}}
実際のレスポンスから知っておくべきことが2つある:
- 出力URLは一時的なものだ。
expireAtが付いているので、すぐにバイトをディスクや自前のストレージにダウンロードすること——ページにホットリンクしないこと。 - 無効な値は課金前に検証で失敗する。
"duration": 99を送るとinvalid input: duration: maximum: got 99, want 16が返り、taskIdは付かない——これが上記の3〜16の境界を無料で確認した方法そのものだ。この400をクライアント側で捕捉して表面化させること。これはリクエストが拒否されたことを意味し、レンダリング途中でタスクが失敗したのではない。
ステップ3——フック、ボディ、CTAを一括生成する
各ビートは静止画1枚 → タスク1つなので、ブロックするチェーンを実行するのではなく、まとめて発射してまとめてポーリングする。今回の実行では3つを一度に送信した。720pと1080pのビートは数分で返り、4Kのフックはその数分後に返った——これこそが、直列に呼び出して待つのではなく非同期で送信すべき理由だ。
ライフスタイルのボディビートは、ポートレート静止画から1080pで6秒にアニメーション化:
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.
CTAのエンドカードビートは、商品静止画に戻って720p・4秒——小さく、安く、締めのカードとして十分:
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.
最小限のバッチループはおおよそ次のようになる——すべてのビートを送信し、タスクIDを集めてからポーリングする:
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)
タスクIDは保持しておくこと。ポーリング中にネットワークが瞬断した場合、保存したIDを再ポーリングする——決して再送信しないこと。さもなければ同じビートに二度払いすることになる。
ステップ4——4K仕上げ、ウェブ用H.264を書き出す
4KのフックはHEVC (H.265)、Main 10、2160×3836で返ってくる——本物の縦型4Kマスターだ。HEVCはブラウザで確実にインライン再生できないため、ウェブ配信用にH.264へ再エンコードする:
# 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
1080pと720pのビートはすでにH.264で返ってくるので、再エンコードは不要——完全にダウンロードされる前に再生を始められるよう、-movflags +faststart で一度リマックスするだけでよい。2160幅のHEVCはアーカイブマスターとして残し、ダウンスケールしたH.264をページに配信する。それがステップ1の冒頭で再生されているフッククリップだ。
ここから先は、3つのビートを concat で1本の縦型ショート動画にまとめるか、プラットフォームがフック・ボディ・CTAを別々にアップロードすることを求めるなら独立した素材のままにしておく。
3ビートのショート動画には実際いくらかかるか
料金は秒単位で、duration に比例して課金され、resolution によって決まる(今回の実行ではライブの /api/pricing に対して確認済み):
| 解像度 | 価格 / 秒 |
|---|---|
| 540p | $0.0515 |
| 720p | $0.109 |
| 1080p | $0.1375 |
| 2K | $0.2175 |
| 4K | $0.446 |
上記のまさにその3ビートのショート動画については:
| ビート | 解像度 | 長さ | 費用 |
|---|---|---|---|
| フック | 4K | 4s | $1.784 |
| ボディ | 1080p | 6s | $0.825 |
| CTA | 720p | 4s | $0.436 |
| 動画合計 | 14s | $3.045 |
これに gpt-image-2 の最初のフレーム2枚が各$0.03で加わり、完成したショート動画の生成コストは約$3.11になる。4Kのフックだけで請求額の59%を占める。フックを1080pに下げれば、3ビート合計で約$1.81になる。4Kのプレミアムは、それに見合う1つのビート——ヒーローのお披露目——に対して払う選択であり、720pのCTAエンドカードは親指でスクロールが止まるスピードでは見分けがつかない。各モデルの完全な料金区分はhiapi 料金ページにある。
よくある質問
リクエストで9:16を強制できますか? いいえ——aspect_ratio フィールドは存在せず、渡すと拒否されます。向きは最初のフレームから継承されるので、呼び出し前に縦型の静止画を作成またはクロップしてください。
なぜ要求していない音がクリップに入っているのですか? Vidu Q4 Preview は各クリップにネイティブ音声トラックを出力し、プロンプト内の音声語彙によってヒントを与えます。無音にしたい場合は、後処理でそのトラックをミュートしてください。
4Kクリップがインライン再生できません——ファイルが壊れているのですか? 壊れていません。4KはHEVC/H.265で返り、一部のブラウザはインラインでレンダリングしません。ステップ4に示すようにH.264へ再エンコードしてください。
1回の呼び出しで複数の商品アングルを渡せますか? このエンドポイントではできません——image_url は単一フレームで、reference_image_urls はここでは拒否されます。複数の参照(と音声)は参照から動画生成エンドポイントです。
1ビートはどれくらい長くできますか? 各クリップは最大16秒です(スキーマは duration の上限を16に設定しています)。より長い作品には、複数のビートを生成して連結してください。
カメラモーションはどう制御しますか? プロンプト内で記述してください——プッシュイン、パララックスオービット、ホールド——上記の3つのプロンプトのように。より深いカメラワーク言語のカタログについては、AI動画のシネマティックなカメラモーションに関する私たちのノートをご覧ください。
静止画を動かし始めよう
力強い画面が1枚あれば、ショート動画のクリップが1本ある。その画面を image_url に指定し、ビートの役割に合った解像度を選び、バッチで実行すればよい。完全な入力スキーマとライブの例はVidu Q4 Preview 画像から動画生成モデルページで確認するか、hiapi クイックスタートで送信とポーリングのループを自分の技術スタックに組み込んでください。