web-dev-qa-db-ja.com

ffmpegを使用して複数のビデオを垂直または水平にスタック(モザイク)しますか?

同じ正確な長さの2つのビデオがあり、それらを1つのビデオファイルにスタックするためにffmpegを使用したいと思います。

これどうやってするの?

19
Joseph Turian

これを行う新しい方法については、この質問の this answer を参照してください。


古いバージョン:
これを行うには、FFmpegで padmovie および overlay フィルターを使用します。コマンドは次のようになります。

ffmpeg -i top.mov -vf 'pad=iw:2*ih [top]; movie=bottom.mov [bottom]; \
  [top][bottom] overlay=0:main_h/2' stacked.mov

最初に、上に配置する必要があるムービーに、高さの2倍のパディングを行います。次に、下のムービーがロードされます。次に、下のムービーは、パディングされたムービーの高さの半分のオフセットでパディングされたトップのムービーにオーバーレイされます。

17
blahdiblah

vstack (垂直)、 hstack (水平)、または xstack (カスタムレイアウト)フィルター。他の方法よりも簡単で高速です。

例1:2つのビデオを組み合わせる/スタックする

垂直

vstack フィルターを使用します。

enter image description here

ffmpeg -i input0 -i input1 -filter_complex vstack=inputs=2 output

動画は同じ幅でなければなりません。

横型

hstack フィルターを使用します。

enter image description here

ffmpeg -i input0 -i input1 -filter_complex hstack=inputs=2 output

動画は同じ高さでなければなりません。

ボーダー付き

pad フィルターを使用します。この例では、2つの側面の間に5pxの黒い境界線を作成します。

enter image description here

ffmpeg -i input0 -i input1 -filter_complex "[0]pad=iw+5:color=black[left];[left][1]hstack=inputs=2" output

例2:上記と同じですが、音声付き

両方の入力からの結合されたオーディオ

amerge filter を追加して、両方の入力からのオーディオチャネルを結合します。

ffmpeg -i input0 -i input1 -filter_complex "[0:v][1:v]vstack=inputs=2[v];[0:a][1:a]amerge=inputs=2[a]" -map "[v]" -map "[a]" -ac 2 output
  • -ac 2は、両方の入力にマルチチャネルオーディオが含まれている場合にステレオにダウンミックスするために含まれています。たとえば、両方の入力がステレオの場合、-ac 2を省略すると、ステレオではなく4チャネルの出力オーディオストリームが得られます。

1つの特定の入力からのオーディオの使用

この例では、input1の音声を使用します。

ffmpeg -i input0 -i input1 -filter_complex "[0:v][1:v]vstack=inputs=2[v]" -map "[v]" -map 1:a output

無音の音声を追加する/ 1つの入力に音声がない場合

オーディオがある入力とオーディオがない入力を混在させると、各入力にオーディオが必要になるため、マージは失敗します。これを防ぐために、 anullsrcフィルター を使用してサイレントオーディオを追加できます。

ffmpeg -i input0 -i input1 -filter_complex "[0:v][1:v]vstack=inputs=2[v];anullsrc[silent];[0:a][silent]amerge=inputs=2[a]" -map "[v]" -map "[a]" -ac 2 output.mp4

例3:3つのビデオ

enter image description here

ffmpeg -i input0 -i input1 -i input2 -filter_complex "[0:v][1:v][2:v]vstack=inputs=3[v]" -map "[v]" output

例4:2x2グリッド

enter image description here

xstack を使用する

ffmpeg -i input0 -i input1 -i input2 -i input3 -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

hstack および vstack の使用

ffmpeg -i input0 -i input1 -i input2 -i input3 -filter_complex "[0:v][1:v]hstack=inputs=2[top];[2:v][3:v]hstack=inputs=2[bottom];[top][bottom]vstack=inputs=2[v]" -map "[v]" output

この構文は理解しやすいですが、上記のようにxstackを使用するよりも効率的ではありません。


例5:テキスト付きの2x2グリッド

enter image description here

drawtext フィルターの使用:

ffmpeg -i input0 -i input1 -i input2 -i input3 -filter_complex
"[0]drawtext=text='vid0':fontsize=20:x=(w-text_w)/2:y=(h-text_h)/2[v0];
 [1]drawtext=text='vid1':fontsize=20:x=(w-text_w)/2:y=(h-text_h)/2[v1];
 [2]drawtext=text='vid2':fontsize=20:x=(w-text_w)/2:y=(h-text_h)/2[v2];
 [3]drawtext=text='vid3':fontsize=20:x=(w-text_w)/2:y=(h-text_h)/2[v3];
 [v0][v1][v2][v3]xstack=inputs=4:layout=0_0|w0_0|0_h0|w0_h0[v]"
-map "[v]" output

例6:入力のサイズ変更/スケーリング

両方のビデオは、vstackの場合は同じにし、hstackの場合は同じ高さにする必要があるため、他のビデオの1つを他のビデオに合わせるためにスケーリングする必要がある場合があります。

単純な scale フィルターの例で、input0の幅を640に設定し、アスペクト比を維持しながら高さを自動的に設定します。

ffmpeg -i input0 -i input2 -filter_complex "[0:v]scale=640:-1[v0];[v0][1:v]vstack=inputs=2" output
65
llogan