FFmpegの簡単な使い方
音声と動画ファイルをマージする必要があったため、調査結果のメモを残しておきます。
データは以下の形式を想定します。
-
video[X].mp4
ビデオファイル(映像のみ) -
audio[X].mp4
音声ファイル
形式変換
ファイル形式の変換
ffmpeg -i video.mp4 video.avi
映像と音声の結合
長さが同じ、または長いほうに合わせる場合
ffmpeg -i video.mp4 -i audio.mp3 output.mp4
時間の短いほうに合わせる場合(-shortest)
ffmpeg -i video.mp4 -i audio.mp3 -shortest output.mp4
高速に結合したい(-copy)
-copyを付けると、ほぼ一瞬でおわります。
ffmpeg -i video.mp4 -i audio.mp3 -shortest -c copy output.mp4
音声の結合
時間をずらして結合
audio1.mp3 の開始5000ミリ秒後から audio2.mp3を結合する。
ffmpeg -y -i audio1.mp3 -i audio2.mp3 -filter_complex "[1]adelay=5000|5000[a1]; [a1]amix=inputs=2:duration=longest[a]" -map "[a]" output.mp3
filter_complexはセミコロン単位に分解して考えればよい。
-
[1]adelay=5000|5000[d1]
[1]は2つめの入力ファイル(audio2.mp3)を指す。adeleayで開始時間を左右チャンネルともに5000ミリ秒に指定。フィルタ後のストリーム名を[d1]とする。 -
[d1]amix=inputs=2:duration=longest[a]
[d1]を利用して結合する。durationで長いほうにあわせる。短いほうに合わせる場合はshortest。
映像の結合
2つのファイルを並べる
ビデオファイル2つを横に並べる。
| video1.mp4 | video2.mp4 |
ffmpeg -i video1.mp4 -i video2.mp4 -filter_complex "hstack" output.mp4
3つ以上のファイルを並べる
ビデオファイル3つを横に並べる。
| video1.mp4 | video2.mp4 | video3.mp4 |
ffmpeg -i video1.mp4 -i video2.mp4 -i video3.mp4 -filter_complex "[0:v][1:v][2:v]hstack=inputs=3[v]" -map "[v]" output.mp4
タイル以外の並べ方
video1のファイルの横幅は1920pxなので、video2,3の横幅は半分の960を設定。
| <----- video1.mp4 ------> |
| video2.mp4 | vodeo3.mp4 |
ffmpeg -i video1.mp4 -i video2.mp4 -i video3.mp4 -filter_complex "[1:v]scale=960:-1[left]; [2:v]scale=960:-1[right]; [left][right]hstack[bottom]; [0:v][bottom]vstack" output.mp4