【ffmpeg】動画・音声を連結する concat の使い方

ffmpeg を使って映像だけ、音声だけ、映像と音声を一緒に後ろにつなげることができる concat の使い方。

関連記事
【ffmpeg】動画・音声を連結する concat の使い方 其の2
【ffmpeg】動画・音声を連結する concat の使い方 其の3


-filter_complex concat=n=2:v=1:a=0

n は連結するファイルの組み合わせの数 既定値は2。映像と音声を別入力した場合の例。映像、音声、映像、音声の4ファイルを入力した場合、n=4 ではなくて、n=2 を指定する。つまり映像と音声で1つの組み合わせになりもう一つの組み合わせを連結する

v は出力する映像ストリーム数 既定値は1。
a は出力する音声ストリーム数 既定値は0。(「1つの映像と2つの音声を持つファイルを3つ連結する」を参照)

  • この方法は必ず再エンコードされる。無劣化連結ではない
  • v と a を 0 にしても連結しないだけで最初に入力したファイルは出力される
  • タイムスタンプは0秒開始でなければならない
  • 異なる解像度の動画を連結するとエラーになるのでリサイズフィルタを使う
  • 異なるフレームレート数の動画を連結すると最初に入力した動画のフレームレート数で固定になる
    ただし、fps フィルタで最初にフレーム数を指定するとそれ以降それに変更できる
  • 映像と音声を連結して最後ではなく途中で音声が動画よりも短かったら無音を挿入する
  • 入力ファイルを指定するときは映像を先にして[映像][音声][映像][音声]のように入力する


無劣化に連結する方法:
【ffmpeg】動画・音声を連結する concat の使い方 其の2
【ffmpeg】動画・音声を連結する concat の使い方 其の3

  • 映像と音声ともに連結する
    ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "concat=n=2:v=1:a=1" output.mp4

  • タイムスタンプを0秒開始にする。
    ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[0:v]setpts=N/FRAME_RATE/TB[0];[1:v]setpts=N/FRAME_RATE/TB[1];[0][0:a][1][1:a]concat=n=2:v=1:a=1" output.mp4

  • -an を使って音声を無効にして映像を連結する
    ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "concat=n=2:v=1:a=0" -an output.mp4

  • -vn を使って映像を無効にして音声を連結する
    ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "concat=n=2:v=0:a=1" -vn output.mp4

  • 音声ファイルを連結する
    ffmpeg -i input1.mp3 -i input2.mp3 -filter_complex "concat=n=2:v=0:a=1" output.mp3

  • 3ファイルを連結する
    ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 -filter_complex "concat=n=3:v=1:a=1" output.mp4

  • 異なる解像度でアスペクト比が同じ動画を scale を使って連結する
    input1.mp4 が 512x288
    input2.mp4 が 640x360
    ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[1:v]scale=512:-2[1v];[0:v][1v]concat;concat=n=2:v=0:a=1" output.mp4

  • 異なるアスペクト比の動画を scale,pad を使って連結する
    640x360 を 512x288 にリサイズ(scale)して余白(pad)を付ける
    input1.mp4 が 512x384
    input2.mp4 が 640x360
    ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[1:v]scale=512:-2,pad=512:384:0:(384-ih)/2 [1v];[0:v][1v]concat;concat=n=2:v=0:a=1" output.mp4

  • 1つの映像と2つの音声を持つファイルを3つ連結する
    ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 -filter_complex "[0:v][0:a:0][0:a:1][1:v][1:a:0][1:a:1][2:v][2:a:0][2:a:1]concat=n=3:v=1:a=2[v][a1][a2]" -map [v] -map [a1] -map [a2] output.mkv


  • それぞれ別ファイルで出力することもできる。
    ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 -filter_complex "[0:v][0:a:0][0:a:1][1:v][1:a:0][1:a:1][2:v][2:a:0][2:a:1]concat=n=3:v=1:a=2[v][a1][a2]" -map [v] output1.mkv -map [a1] output2.mkv -map [a2] output3.mkv

  • 音声時間が短くて無音が挿入される例。testsrc2-concat.mp4の映像は10秒が2つの20秒になり、testsrc2-concat.m4aの音声時間は2秒と8秒無音が挿入され、さらに2秒を加えた12秒になる。
    ffmpeg -f lavfi -i testsrc2=d=10 testsrc2.mp4
    ffmpeg -f lavfi -i sine=440:0:44100:2 mono.wav
    ffmpeg -i testsrc2.mp4 -i mono.wav -i testsrc2.mp4 -i mono.wav -filter_complex "concat=n=2:v=1:a=1" testsrc2-concat.mp4
    ffmpeg -i testsrc2-concat.mp4 -vn -c copy testsrc2-concat.m4a
    ffmpeg -i testsrc2-concat.m4a


失敗例

  • input2 の音声は連結されない
    ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "concat=n=2:v=1:a=0" output.mp4
    これも上と同じ
    ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "concat" output.mp4

  • input2 の映像は連結されない
    ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "concat=n=2:v=0:a=1" output.mp4



動画を連結するときにフェードアウト・インする方法


input1.mp4 ファイルの70フレーム目から30フレームの間にフェードアウトし、input2.mp4 の開始0フレームから30フレームかけてフェードインする。
ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[0:v]fade=out:70:30[0v];[1:v]fade=in:0:30[1v];[0v][0:a][1v][1:a]concat=n=2:v=1:a=1" output.mp4

関連記事

コメント

非公開コメント

プロフィール

ロベルト

お問い合わせはこちらまで
robelt2525[at]gmail.com

中の人 @nico_lab

広告リンク
Amazon
楽天市場

ブログ更新用 @blo_nico_lab

詳しいプロフィールはこちら

当ブログは、Amazonアソシエイトに参加しています。