エンコード設定の比較、ゲームの同時視点、リアクション動画、手ぶれ補正の Before/After——2 本以上の動画を 1 画面に並べたい場面は意外と多いものです。FFmpeg には hstack(横並び)、vstack(縦並び)、xstack(任意レイアウト)の 3 つのスタックフィルタがあり、overlay で座標計算をするより簡単で高速です。
一方で、初めて使うと必ず一度は踏むのが「高さが揃っていないとエラー」という制約です。この記事はそこから始めます。
動作確認: FFmpeg 8.1 / Windows — 本記事のコマンド 10 件を検証スクリプトで実行し、全て成功しました(2026-09-06)
横並び(hstack)の基本
ffmpeg -i left.mp4 -i right.mp4 -filter_complex "[0:v][1:v]hstack=inputs=2[v]" -map "[v]" -map 0:a -c:a copy output.mp4
[0:v][1:v]— 1 番目・2 番目の入力の映像ストリームhstack=inputs=2— 2 本を左から順に横に並べる-map "[v]"— スタック結果を出力の映像に-map 0:a -c:a copy— 音声は左側の動画のものをそのまま使う
1920×1080 の動画を 2 本並べると出力は 3840×1080 になります。素材の解像度は足し算されるだけで、勝手に縮小はされません。
高さが違うときのエラー
[Parsed_hstack_0] Input 1 height 720 does not match input 0 height 1080.
[Parsed_hstack_0] Failed to configure output pad on Parsed_hstack_0
Error reinitializing filters!
hstack は全入力の高さが、vstack は全入力の幅が一致していないと動きません。ピクセルフォーマットも揃っている必要があります。解決は先に scale で揃えることです。
ffmpeg -i left.mp4 -i right.mp4 -filter_complex "[0:v]scale=-2:720[l];[1:v]scale=-2:720[r];[l][r]hstack=inputs=2[v]" -map "[v]" -map 0:a output.mp4
scale=-2:720 は「高さ 720、幅はアスペクト比を保って 2 の倍数に丸める」という指定です。-1 ではなく -2 を使うのは、幅が奇数になると libx264 が width not divisible by 2 で止まるからです(高さ・幅が 2 で割り切れないエラー)。
出力を元の解像度に収める
比較動画を 1080p のまま配信したいなら、各入力を半分の幅にしてから並べます。
ffmpeg -i left.mp4 -i right.mp4 -filter_complex "[0:v]scale=960:-2[l];[1:v]scale=960:-2[r];[l][r]hstack=inputs=2[v]" -map "[v]" -map 0:a output.mp4
16:9 の素材を 960 幅にすると高さは 540 になり、出力は 1920×540 です。上下に黒帯を入れて 1920×1080 にしたければ、末尾に pad=1920:1080:0:(oh-ih)/2 を足します。
実測: 出力サイズと処理時間
1920×1080 / 30fps / 10 秒の同じクリップを 2 本並べ、libx264 -preset veryfast -crf 23 でエンコードしたときの数字です(i9-14900KF、FFmpeg 8.1、2026-09-02 計測)。
| 構成 | 出力解像度 | ファイルサイズ | 処理時間 |
|---|---|---|---|
| 1 本だけ再エンコード(基準) | 1920×1080 | 5.1 MB | 1.1 s |
| そのまま横並び | 3840×1080 | 10.2 MB | 2.1 s |
| 各 960 幅に縮小して横並び | 1920×540 | 3.0 MB | 1.2 s |
そのまま並べると画素数が 2 倍になるので、サイズも時間もほぼ 2 倍です。縮小してから並べれば画素数は元の半分になり、1 本分より小さくなります。「比較のためにディテールを残したい」なら前者、「SNS に上げる」なら後者、という選び方になります。
縦並び(vstack)
ffmpeg -i top.mp4 -i bottom.mp4 -filter_complex "[0:v][1:v]vstack=inputs=2[v]" -map "[v]" -map 0:a output.mp4
1080p を 2 本重ねると 1920×2160。縦動画(1080×1920)を横並びにしたいときは hstack、横動画を縦に積んでスマホ向けの 9:16 にしたいときは vstack です。今回は 幅が揃っていないとエラーになります。
3 本以上・グリッド(xstack)
3 本を横一列に並べるなら hstack=inputs=3 で済みます。
ffmpeg -i a.mp4 -i b.mp4 -i c.mp4 -filter_complex "[0:v][1:v][2:v]hstack=inputs=3[v]" -map "[v]" output.mp4
2×2 のグリッドは xstack で、各入力の左上座標を layout に列挙します。
ffmpeg -i a.mp4 -i b.mp4 -i c.mp4 -i d.mp4 -filter_complex "[0:v][1:v][2:v][3:v]xstack=inputs=4:layout=0_0|w0_0|0_h0|w0_h0[v]" -map "[v]" output.mp4
layout の読み方:
| 記述 | 意味 |
|---|---|
0_0 |
入力 0 を左上(x=0, y=0) |
w0_0 |
入力 1 を x=入力 0 の幅、y=0(右上) |
0_h0 |
入力 2 を x=0、y=入力 0 の高さ(左下) |
w0_h0 |
入力 3 を右下 |
w0・h0 は「入力 0 の幅・高さ」を表す変数で、w0+w1 のような足し算も書けます。720p を 4 枚並べると出力は 2560×1440 です。
入力が 3 本しかなく右下が空く場合は fill で埋める色を指定してください。指定しなくてもエラーにはなりませんが、空いた領域の内容は未定義になります(黒とは限りません)。
ffmpeg -i a.mp4 -i b.mp4 -i c.mp4 -filter_complex "[0:v][1:v][2:v]xstack=inputs=3:layout=0_0|w0_0|0_h0:fill=black[v]" -map "[v]" output.mp4
音声の扱い
スタックフィルタは映像だけを扱うので、音声は自分で決める必要があります。
片方の音声を使う(一番多いケース)— -map 0:a または -map 1:a。
両方をミックスする — amix を同じフィルタグラフに書きます。
ffmpeg -i left.mp4 -i right.mp4 -filter_complex "[0:v][1:v]hstack=inputs=2[v];[0:a][1:a]amix=inputs=2[a]" -map "[v]" -map "[a]" output.mp4
amix はデフォルトで各入力の音量を 1/N に下げるので、2 本混ぜると全体が約 6 dB 小さくなります。気になる場合は amix=inputs=2:normalize=0 で無効化できます(クリップには注意)。
音声なし — -an。
長さが違う動画
デフォルトでは長いほうに合わせ、短いほうは最後のフレームで止まります。短いほうで終わらせたいときは shortest=1 を付けます。
ffmpeg -i left.mp4 -i right.mp4 -filter_complex "[0:v][1:v]hstack=inputs=2:shortest=1[v]" -map "[v]" output.mp4
仕切り線と Before / After ラベル
境界を分かりやすくするには、左側に pad で数ピクセル分の余白を足してから並べます。
ffmpeg -i left.mp4 -i right.mp4 -filter_complex "[0:v]pad=iw+10:ih:0:0:color=black[l];[l][1:v]hstack=inputs=2[v]" -map "[v]" output.mp4
ラベルは drawtext を各入力に個別にかけてからスタックします。
ffmpeg -i left.mp4 -i right.mp4 -filter_complex "[0:v]drawtext=text='Before':fontsize=24:fontcolor=white:x=10:y=10[l];[1:v]drawtext=text='After':fontsize=24:fontcolor=white:x=10:y=10[r];[l][r]hstack=inputs=2[v]" -map "[v]" output.mp4
日本語ラベルには fontfile= でフォントを指定する必要があります。詳細は drawtext フィルタ を参照してください。
よくある質問
overlay と何が違う?
overlay は「背景の上に前景を置く」フィルタで、並べるには先に pad でキャンバスを広げ、座標を計算して重ねる必要があります。hstack/vstack は入力を並べるだけなので記述が短く、overlay より処理も軽いです。一方、重ねる位置を自由に決めたい(ピクチャ・イン・ピクチャなど)なら overlay の仕事です。
フレームレートが違う動画を並べたら?
エラーにはなりませんが、出力のタイムスタンプが片方に引っ張られてカクつくことがあります。先に fps=30 などで揃えてください。
同じ動画を 2 回読み込みたくない
比較対象が「同じ素材の別処理」なら、split で 1 入力を 2 系統に分けて片方だけフィルタをかけられます: [0:v]split[a][b];[b]eq=contrast=1.3[c];[a][c]hstack。
関連ツール
動画を横並び・縦並びにするツールは、2 本の動画をアップロードなしでブラウザ内に並べます。高さの調整も自動で行います。
関連記事
- 動画のサイズ変更(scale) — 並べる前の解像度合わせ
- 高さ・幅が 2 で割り切れないエラー —
-2を使う理由 - ウォーターマーク・オーバーレイ —
overlayによる重ね合わせ - drawtext フィルタ — ラベル文字の描画