2本以上の動画を1つの画面に並べるには、hstack(横並び)、vstack(縦並び)、xstack(自由な配置)の3つのスタックフィルタ(動画を並べるフィルタ)を使います。overlay で座標を計算して重ねるより、書き方が簡単で処理も速いです。エンコード設定の比較、手ぶれ補正の Before/After、ゲームの同時視点、リアクション動画などに使えます。
初めて使うときによくつまずくのは、高さがそろっていないとエラーになることです。
横並び(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 はすべての入力の幅がそろっていないと動きません(ピクセルフォーマットは違っていても、FFmpeg が自動で変換します)。先に 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、横動画を縦に積むときは vstack を使います。16:9 の動画を2本積んでも 8:9 にしかならないので、スマホ向けの 9:16 にするには、さらに scale と pad で縮小して上下に余白を足します。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(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 フィルタ — ラベル文字の描画