同じ正確な長さの2つのビデオがあり、それらを1つのビデオファイルにスタックするためにffmpegを使用したいと思います。
これどうやってするの?
これを行う新しい方法については、この質問の this answer を参照してください。
古いバージョン:
これを行うには、FFmpegで pad 、 movie および 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倍のパディングを行います。次に、下のムービーがロードされます。次に、下のムービーは、パディングされたムービーの高さの半分のオフセットでパディングされたトップのムービーにオーバーレイされます。
vstack (垂直)、 hstack (水平)、または xstack (カスタムレイアウト)フィルター。他の方法よりも簡単で高速です。
vstack フィルターを使用します。
ffmpeg -i input0 -i input1 -filter_complex vstack=inputs=2 output
動画は同じ幅でなければなりません。
hstack フィルターを使用します。
ffmpeg -i input0 -i input1 -filter_complex hstack=inputs=2 output
動画は同じ高さでなければなりません。
pad フィルターを使用します。この例では、2つの側面の間に5pxの黒い境界線を作成します。
ffmpeg -i input0 -i input1 -filter_complex "[0]pad=iw+5:color=black[left];[left][1]hstack=inputs=2" output
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チャネルの出力オーディオストリームが得られます。この例では、input1
の音声を使用します。
ffmpeg -i input0 -i input1 -filter_complex "[0:v][1:v]vstack=inputs=2[v]" -map "[v]" -map 1:a output
オーディオがある入力とオーディオがない入力を混在させると、各入力にオーディオが必要になるため、マージは失敗します。これを防ぐために、 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
ffmpeg -i input0 -i input1 -i input2 -filter_complex "[0:v][1:v][2:v]vstack=inputs=3[v]" -map "[v]" output
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
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を使用するよりも効率的ではありません。
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
両方のビデオは、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
アスペクト比を維持しながら任意のサイズのビデオを特定のサイズに合わせるより高度な方法については、 静的サイズのプレーヤーに合うようにffmpegでビデオのサイズを変更する を参照してください。
scale2ref フィルターを使用して、1つのビデオを他のビデオのサイズに合わせて自動的にサイズ変更することもできます。