Kling 4.0入力ファイルの制限を事前チェックする
Kling 4.0 動画 入力 制限をアップロード前に機械的に確認しておくと、「アップロードしてから弾かれる」「合計時間オーバーで参照動画を削り直す」といった手戻りを減らせます。この記事では、写真と参照動画の制限値を整理し、ffprobe と Python で事前チェックする小さなスクリプトを作ります。
先にお断りです。筆者は MixVio のチームメンバーで、本記事は AI の支援を受けて下書きし、コードは手で確認しています。制限値は MixVio の Kling 4.0 モデルページの記載に基づいており、筆者独自の計測ではありません。
公式ドキュメント
Kling 4.0 は 2026年10月15日に Kling AI が正式公開した動画モデルです。モデル自体の入力仕様やプロンプトの考え方は、Kling 4.0 公式ユーザーガイドが一次情報です。ffprobe のオプションは FFmpeg 公式ドキュメント(ffprobe)を参照してください。
公式ガイドの数値(たとえばプロンプト上限)は単位が異なるものがあるため、以下では MixVio 上の Kling 4.0 ルートの制限だけを使います。
チェックする制限値
MixVio の参照モード(reference to video)では、画像最大10枚・動画最大5本(合計15ファイル)を渡せます。アップロード時の制限は次のとおりです。
写真
- 1枚30MBまで
- 短辺300px以上
- アスペクト比(幅÷高さ)0.4〜2.5
参照動画
- 1本3〜30.05秒
- 1本300MBまで
- 縦横とも700〜4,553px
- フレームレート23.9〜60fps
- アスペクト比0.4〜2.5
動画全体
- 最大5本
- 合計の長さ30.05秒以内
プロンプトは2,500文字までです。ファイル名ではなく、プロンプト内で @Image1 や @Video1 のように参照します。
準備
必要なのは Python 3 と ffmpeg(ffprobe)、画像サイズ取得用の Pillow です。
pip install pillow
ffprobe -version
写真のチェック
import os
from PIL import Image
PHOTO_MAX_MB = 30
PHOTO_MIN_SHORT = 300
RATIO_MIN, RATIO_MAX = 0.4, 2.5
def check_photo(path):
errors = []
size_mb = os.path.getsize(path) / (1024 * 1024)
if size_mb > PHOTO_MAX_MB:
errors.append(f"size {size_mb:.1f}MB > {PHOTO_MAX_MB}MB")
with Image.open(path) as im:
w, h = im.size
if min(w, h) < PHOTO_MIN_SHORT:
errors.append(f"short side {min(w, h)}px < {PHOTO_MIN_SHORT}px")
ratio = w / h
if not RATIO_MIN <= ratio <= RATIO_MAX:
errors.append(f"ratio {ratio:.2f} outside {RATIO_MIN}-{RATIO_MAX}")
return errors
アスペクト比は「幅÷高さ」で計算しています。縦長の 9:16 は約0.56、横長の 21:9 は約2.33 なので、どちらも範囲内です。
参照動画のチェック
ffprobe で幅・高さ・フレームレート・長さを JSON で取り出します。
import json
import subprocess
VID_MAX_MB = 300
VID_MIN_S, VID_MAX_S = 3.0, 30.05
SIDE_MIN, SIDE_MAX = 700, 4553
FPS_MIN, FPS_MAX = 23.9, 60.0
def probe(path):
cmd = [
"ffprobe", "-v", "error", "-select_streams", "v:0",
"-show_entries", "stream=width,height,r_frame_rate:format=duration",
"-of", "json", path,
]
out = subprocess.run(cmd, capture_output=True, text=True, check=True)
data = json.loads(out.stdout)
st = data["streams"][0]
num, den = st["r_frame_rate"].split("/")
fps = float(num) / float(den)
dur = float(data["format"]["duration"])
return st["width"], st["height"], fps, dur
def check_video(path):
errors = []
size_mb = os.path.getsize(path) / (1024 * 1024)
if size_mb > VID_MAX_MB:
errors.append(f"size {size_mb:.0f}MB > {VID_MAX_MB}MB")
w, h, fps, dur = probe(path)
if not VID_MIN_S <= dur <= VID_MAX_S:
errors.append(f"duration {dur:.2f}s outside {VID_MIN_S}-{VID_MAX_S}")
for side in (w, h):
if not SIDE_MIN <= side <= SIDE_MAX:
errors.append(f"side {side}px outside {SIDE_MIN}-{SIDE_MAX}")
if not FPS_MIN <= fps <= FPS_MAX:
errors.append(f"fps {fps:.2f} outside {FPS_MIN}-{FPS_MAX}")
ratio = w / h
if not RATIO_MIN <= ratio <= RATIO_MAX:
errors.append(f"ratio {ratio:.2f} outside {RATIO_MIN}-{RATIO_MAX}")
return errors, dur
注意点として、縦横どちらも700px以上が必要なので、720p(1280×720)の動画は通りますが、短辺が700px未満の 640×360 のような動画は弾かれます。
パック全体のチェック
最後に、枚数・本数・合計時間をまとめて確認します。
MAX_PHOTOS, MAX_VIDEOS, MAX_TOTAL_S = 10, 5, 30.05
def check_pack(photos, videos):
report = {}
if len(photos) > MAX_PHOTOS:
report["pack"] = [f"{len(photos)} photos > {MAX_PHOTOS}"]
if len(videos) > MAX_VIDEOS:
report.setdefault("pack", []).append(
f"{len(videos)} videos > {MAX_VIDEOS}")
for p in photos:
report[p] = check_photo(p)
total = 0.0
for v in videos:
errs, dur = check_video(v)
report[v] = errs
total += dur
if total > MAX_TOTAL_S:
report.setdefault("pack", []).append(
f"video total {total:.2f}s > {MAX_TOTAL_S}s")
return report
使い方は次のとおりです。リストの順番を、プロンプトで書く @Image1、@Image2 … の順にそろえておくと取り違えを防げます。
photos = ["01_face_a.jpg", "02_body_a.jpg", "03_lobby.jpg"]
videos = ["01_walk.mp4"]
for name, errs in check_pack(photos, videos).items():
print("OK " if not errs else "NG ", name, errs)
よくある引っかかり
- 合計時間: 動画は1本ずつなら制限内でも、合計が30.05秒を超えることがあります。動きの参考に必要な数秒だけを切り出しておきます。
- 低解像度の参照動画: スマホで書き出した 640×360 などは短辺700px未満で通りません。
- 極端な比率: パノラマ写真(アスペクト比2.5超)や細長いスクリーンショット(0.4未満)は事前にトリミングします。
- 画像の比率と出力の比率は別: 参照モードの出力比率は auto / 16:9 / 9:16 / 1:1 / 21:9 から選びます。image to video では出力比率が開始画像に従うので、アップロード前に切り抜いておきます。
以前書いた ffmpegで16:9動画を9:16にレターボックス変換する記事も、参照動画の比率を整えるときに使えます。
よくある質問
Q. 写真の枚数で費用は変わりますか?
A. MixVio では写真の枚数は見積もりに影響しません。参照動画の秒数は影響します。
Q. チェックを通れば必ず生成できますか?
A. このスクリプトはアップロード制限だけを確認します。生成結果の品質は別問題なので、短い尺の 720p で試してから本番を回してください。
まとめ
制限値を定数にまとめ、写真・動画・パック全体の3段階でチェックすれば、アップロード前に問題が分かります。チェックを通ったファイルは、MixVio の Kling 4.0 ジェネレーターの参照モードでそのまま使えます。
本記事の執筆には AI の支援を受けています。