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本の動画をアップロードせずに、ブラウザの中で並べます。高さも自動でそろえます。

関連記事