0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Kling 4.0入力ファイルの制限を事前チェックする

0
Last updated at Posted at 2026-10-24

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 の支援を受けています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?