HiAPI
ブログ

使用ガイド

Vidu Q4 Preview 画像から動画生成:商品の静止画を4Kショート動画クリップに変える

Oct 19, 2026
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点はいずれも間違えやすい:

  1. aspect_ratio フィールドは存在しない。 渡すと即座に拒否される(invalid input: <root>: additional properties 'aspect_ratio' not allowed)。クリップは最初のフレームから向きを継承する——9:16の静止画は9:16のクリップを生む。向きは静止画を作る時点で決まるのであって、呼び出し時ではない。だからショート動画を作るなら、最初から縦型で決めておく必要がある。
  2. resolution が設定するのは短辺であり、長辺ではない。 縦型画面では、1080p は1080×1918を返し、720p は720×1278を返す。縦型静止画で 4k を使うと幅2160の巨大なものになる(ここでは2160×3836)——予算とエンコードもそれに合わせて計画すること。
  3. すべてのクリップに音声トラックが付く。 音声参照がなくてもだ。3つの出力すべてに48 kHzのステレオAAC音声トラックが付き、プロンプト内の音声語彙によって駆動される。残すのか後でミュートするのかを計画しておくこと。決して欠けることはない。
  4. image_url は単数形だ。 reference_image_urls を渡すと拒否される(additional properties 'reference_image_urls' not allowed)——その配列は参照から動画生成に属する。静画1枚を入力し、クリップ1本を出力する。

最後の点が本当の分かれ道だ。複数の商品アングルを固定して揃える必要があるなら、必要なのは参照から動画生成だ。良い画面が1枚あるなら、画像から動画生成のほうがシンプルで安価だ。

パイプラインの概要

ショート動画のシーケンスは結局のところN個の独立した単一フレームアニメーションなので、全体はきれいに並列化できる:

  1. 各ビートごとに最初のフレームを1枚用意する——ショート動画は縦型(9:16)で。向きは画面に固定されるため。
  2. 各ビートを独立した非同期タスクとして送信する——1ビートにつき1回の POST /v1/tasks。最初の1つが完了するまで他をブロックしないこと。
  3. 各 taskId を success までポーリングし、mp4をダウンロードする(出力URLから)。
  4. 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 クイックスタートで送信とポーリングのループを自分の技術スタックに組み込んでください。

永続的なAIアーティファクトで開発を始める

APIキーを取得して、タスクベースの1つのAPIで画像・動画・音声モデルを呼び出せます。

APIドキュメントを読む