ffmpegで動画をタイル配置する
概要
ffmpegで複数の入力動画をタイル状に配置して出力する方法を具体例で説明する。
使用例
次のコマンドでは、4つの入力動画(1.avi,2.avi,3.avi,4.avi)を左上に1.avi、右上に2.avi、左下に3.avi、右下に4.aviの配置でタイル上に並べた動画をoutput.mkvとして出力する[1]。
ffmpeg -i 1.avi -i 2.avi -i 3.avi -i 4.avi -filter_complex " nullsrc=size=640x480 [base]; [0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright]; [2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft]; [3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=320 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=320:y=240 " -c:v libx264 output.mkv
-filter_complexオプションの引数は全体をダブルクオーテーションで囲む。 一行目から見ていこう。
nullsrc=size=640x480 [base];
ここでは、まず何も配置していない空の背景をnullsrcフィルターで640x480のサイズで生成してbaseという名前をつけている。
[0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft];
次に、[0:v]というのが一つ目の入力動画1.aviを表し、setoptsフィルターで入力動画の再生時刻の情報(PTS, presentation timestamp)を設定する。この例の場合はsetpts=PTS-STARTPTSと指定することで動画の最初から再生するように指定している。 scaleは幅x高さで動画の大きさをピクセル単位で指定する。最後に、この入力動画にupperleftという名前をつけている。この名前は好きな名前で良い。
[1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright]; [2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft]; [3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright];
2,3,4個目の入力動画に対しても同様の指定を行う。
[base][upperleft] overlay=shortest=1 [tmp1];
今度は、何も無い背景のbaseにupperleftを貼り付けている。shortest=1というのは短い方の動画が終わったら動画の出力を終了するという指定を行っている。baseにupperleftを貼り付けた出力をtmp1と名前をつけている。
[tmp1][upperright] overlay=shortest=1:x=320 [tmp2];
同様に、tmp1にupplerrightを貼りつけている。この時は、x=320(pixel)の場所に貼り付けるという指定をしている。貼りつけた出力にtmp2と名前をつけている。
[tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3];
lowerleftを貼り付けるのも同様に行う。
[tmp3][lowerright] overlay=shortest=1:x=320:y=240
最後に、lowerrightを貼りつけて、これを最終的な出力としている。最後はセミコロンがないことに注意。
以上のような方法で複数の入力動画をタイル上に配置して出力することができる。