2026-06-08 — 回閲覧
llama.cpp がネイティブ動画入力を獲得:FFmpeg サブプロセス・デコードが mtmd スタックに着地
2026 年 6 月 8 日、llama.cpp は PR #24269 をマージし、マルチモーダル(mtmd)サブシステムにネイティブ動画入力を追加した。FFmpeg をリンクするのではなく、FFmpeg サブプロセスを呼び出してフレームをデコードし、新しい遅延ビットマップ API が単一の動画マーカーをトークン化時にデコード済みフレームへ展開する。この設計はモデル非依存であり、Qwen3-VL や Gemma-4
何がリリースされたか
2026 年 6 月 8 日、llama.cpp は PR #24269(作者 ngxson、レビューは ggerganov)をマージし、マルチモーダルサブシステム mtmd にネイティブ動画入力を追加した。この変更は、2025 年 12 月の時点で計画を概説していた issue #18389 をクローズし、メンテナが FOSDEM 2026 のマルチモーダルサポートに関する講演で提示した 3 つのロードマップ項目のうちの 1 つを達成する(他の 2 つはテキスト読み上げと画像生成)。この機能は build b9562 以降に登場する。
これ以前、llama.cpp で動画に対してビジョン言語モデルを実行するには、自分でクリップをデコードし、フレームを静止画像の連なりとして与える必要があった。いまや動画は CLI とサーバーの双方にとって第一級の入力タイプである。
仕組み
興味深いエンジニアリング上の選択は、ピークスループットの追求ではなく、苦痛の回避に関するものだ。
デコードについて、llama.cpp は libavcodec にリンクせず、コーデックを同梱もしない。代わりに FFmpeg を外部サブプロセスとして呼び出す(issue スレッドはこれを libavcodec の dlopen と比較検討し、静的リンクを「実際には悪い UX につながる」と指摘して即座に却下した)。これには 2 つの動機がある。専有フォーマットに由来するコーデックのライセンス上の複雑さを回避でき、ビルドを依存関係なしに保てる点だ。トレードオフは、ユーザーが FFmpeg を別途インストールしなければならないことであり、それは llama.cpp に同梱されていない。
トークン化の側では、新しい遅延ビットマップ API(mtmd_bitmap_init_lazy)が動画ごとに単一の <__media__> マーカーを受け取り、それをトークン化時に複数のデコード済み画像フレームへ展開する。フレーム展開がライブラリ内部で行われるため、サーバーと CLI は完全な動画サポートを得るのにわずかな変更しか必要としなかった。フレームを融合するモデル(たとえば Qwen の 3D 畳み込み経路)向けには、複数フレームをまとめてバッチ化できるよう、内部の clip_image_f32 構造に次元が 1 つ追加された。
その結果はモデル非依存である。GGUF エコシステム内の既存のビジョンモデルはどれも、モデルごとの変更なしに動画を受け取れる。メンテナは CLI 上で Qwen3-VL-2B を、web UI で Gemma-4-E4B をテストし、Blender のオープンムービー短編 Agent 327 の 10 秒クリップを使用した。スレッドで範囲に含まれた近い将来のフォローアップには、--video-ffmpeg-path および --video-fps フラグ、加えて別トラックとしての音声入力がある。
ローカル推論にとってなぜ重要か
| 観点 | 以前 | PR #24269 以後 |
|---|---|---|
| 動画の扱い | 手動でのフレーム抽出、画像シーケンスとして投入 | 単一の <__media__> マーカー、ライブラリがフレームをデコード |
| コーデック依存 | なし(あなたの問題) | FFmpeg サブプロセス、同梱なし、リンクなし |
| モデルの変更 | パイプラインごとの接着 | モデル非依存。既存の GGUF ビジョンモデルで動作 |
| 入口 | 場当たり的なスクリプト | CLI と llama-server、第一級 |
当初の機能リクエストは、その意義を率直に示していた。動画理解は「専門的な専有 API からローカル推論へ」と移行しつつあり、その見返りは「重い Python 依存なしに、コンシューマー向けハードウェア上でプライバシーを保護する動画分析」である。これは、C/C++ ランタイムが動画を担うことがなぜ重要なのかを言い当てている。人々がローカルのテキストおよび画像推論にすでに使っているのと同じワークステーション級・ユニファイドメモリ機が、いまやクラウド API なし、かつ PyTorch スタックなしで、時系列推論ワークロード(イベント局在化、動きと因果に関する問い、身体性エージェントの知覚)を実行できる。
サブプロセスベースのデコーダは、ローカルハードウェアの現実にもよく合う。フレームのデコードはビジョンエンコーダや LLM のデコードパスに比べて安価なので、それを実戦で鍛えられた外部バイナリに委ねるコストはわずかであり、その一方で本来なら採用を停滞させかねないビルドシステムとライセンスの頭痛の種を回避できる。
実務者向けメモ
試したいなら、b9562 以上の build を取得し、PATH に FFmpeg をインストールし、Qwen3-VL や Gemma-4 のようなビジョンモデルとともに動画を llama-mtmd-cli あるいは llama-server に向ければよい。フレーム数に注意すること。遅延展開器は 1 つのマーカーを多数の画像トークンに変えるため、高いサンプリングレートでの長いクリップはコンテキスト長と KV メモリをすぐに膨れ上がらせかねない。--video-fps が広く行き渡るまでは、実効フレームレートを、あるクリップが特定のマシン上であなたのコンテキスト予算に収まるかどうかを決めるレバーとして扱うこと。そして FFmpeg は独立したサブプロセスなので、デコード挙動がマシン間で再現可能であり続けるよう、環境内でそのバージョンを固定すること。
見落とされがちな観点
静かに重要な細部は、そのライセンス姿勢である。コーデックをリンクも同梱もすることを拒み、代わりにユーザーがインストールしたどの FFmpeg でも呼び出すことで、llama.cpp は自身の配布物を特許に縛られたデコーダから清潔に保ちつつ、それでも人々が実際に手にしている雑然とした現実世界のフォーマットをサポートする。これは、ベンチマークの図表にはめったに載らないが、寛容なライセンスで広く再配布されるバイナリにおいて、ある機能がそもそも出荷できるかどうかを左右する類の判断だ。それはまた、コンプライアンスの負担を運用者の環境へ巧妙に移すものでもあり、ローカルファーストのツールにおいてはそこが正しい置き場所である。そしてこれは、これまで動画を避けてきた他のランタイムが、結局は模倣することになるかもしれないパターンだ。
Sources
- llama.cpp Releases (b9562, June 8 2026, video input feature) — ggml-org/llama.cpp ↗
- mtmd: plan to add video input support · Issue #18389 (closed by PR #24269) — ggml-org/llama.cpp ↗
- llama.cpp Adds Video Input via FFmpeg Subprocess — AI Weekly ↗
- Feature Request: Add Video Modality Support (Qwen2.5-VL) via llama-mtmd-cli · Issue #17660 — ggml-org/llama.cpp ↗
- Multimodal support in llama.cpp — Achievements and Future Directions (FOSDEM 2026) ↗