ffmpegを使った動画連結の方法

ロゴPC君 IT知識

自分の為のffmpeg覚え書き。

連結したい動画ファイル名を記述したテキストファイルを作成

メモ帳などで以下のようなテキストファイルを作成する

例)list.txt

file infile1.mp4
file infile2.mp4

先頭に file と記述し、半角スペースを入れて連結したいファイル名を記述する。
記述した順序でファイルが連結される
上記例だと、infile1.mp4 > infile2mp4の順に連結される。

ターミナルまたはコマンドプロンプトからconcatオプションつきで実行

例)list.txtに記述された動画ファイルを連結して、outfile.mp4というファイル名で出力する場合

ffmpeg -f concat -i list.txt -c copy outfile.mp4

このconcatオプションを使う場合、一つ注意点があるのだが、フレームレートの違う動画などを連結してしまうとうまくいかない

例えば、フレームレート60fpsの動画と30fpsの動画を連結してしまうと動画が途中で静止してしまい音声だけが流れている…といったような変な動画になってしまう。

これを解決するには、連結する動画のフレームレートを統一しておくと良い。

ffmpegで動画のフレームレート(fps)を強制的に変更して出力する方法は以下で解説しています。

ffmpeg:動画のフレームレート(fps)を強制的に変更して出力したい
例えばffmpegで60fpsの動画 file.mp4 を30fpsに落として out.mp4 として出力するには、 ffmpeg -i file.mp4 -r 30 out.mp4 とすれば良い。

コメント

  1. なつき より:

    初めまして。
    結合したい2つの動画のフレーム率が一方は30.00、もう一方は29.97の場合、どのようにしたらなるべく無劣化で綺麗に結合できますでしょうか?
    教えていただけますと幸いです。

    • shuichi より:

      なつきさん、こんにちは。管理人です。

      > 結合したい2つの動画のフレーム率が一方は30.00、もう一方は29.97の場合、どのようにしたらなるべく無劣化で綺麗に結合できますでしょうか?

      微妙な差ですが、フレームレートが違う動画を連結してしまうと動画が静止したまま音声だけ流れているみたいな感じになってしまいますよね。

      この場合であれば、フレーム率が小さい方の29.97に30.00の動画のフレーム率を合わせておいてから連結してはと思います。

      例えば、30.00(fps)の動画がfile1.mp4、29.97(fps)の動画がfile2.mp4というファイル名だったとして、

      まず、file1.mp4を29.97に強制的にフレームレートを合わせて出力

      ffmpeg -i file1.mp4 -r 29.97 file1_out.mp4

      連結したいファイル名を保存したテキストファイル(list.txt)を作って保存しておき(file1_out.mp4 -> file2.mp4の順に連結する場合)

      file1_out.mp4
      file2.mp4

      最後に連結コマンドを実行

      ffmpeg -f concat -i list.txt -c copy outfile.mp4

      などとしてはいかがでしょうか?

  2. なつき より:

    わかりやすいご返信ありがとうございます。
    教えていただいたとおりに試してみます。

    また、2点質問なのですが
    -rとはフレーム率を変更する際に使用するなオプションになるのでしょうか?
    フレーム率についてよくわかっていないのですが、30.00と29.97とでは大きく差がないのでしょうか?

タイトルとURLをコピーしました