自分の為の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
とすれば良い。
コメント
初めまして。
結合したい2つの動画のフレーム率が一方は30.00、もう一方は29.97の場合、どのようにしたらなるべく無劣化で綺麗に結合できますでしょうか?
教えていただけますと幸いです。
なつきさん、こんにちは。管理人です。
> 結合したい2つの動画のフレーム率が一方は30.00、もう一方は29.97の場合、どのようにしたらなるべく無劣化で綺麗に結合できますでしょうか?
微妙な差ですが、フレームレートが違う動画を連結してしまうと動画が静止したまま音声だけ流れているみたいな感じになってしまいますよね。
この場合であれば、フレーム率が小さい方の29.97に30.00の動画のフレーム率を合わせておいてから連結してはと思います。
例えば、30.00(fps)の動画がfile1.mp4、29.97(fps)の動画がfile2.mp4というファイル名だったとして、
まず、file1.mp4を29.97に強制的にフレームレートを合わせて出力
連結したいファイル名を保存したテキストファイル(list.txt)を作って保存しておき(file1_out.mp4 -> file2.mp4の順に連結する場合)
最後に連結コマンドを実行
などとしてはいかがでしょうか?
わかりやすいご返信ありがとうございます。
教えていただいたとおりに試してみます。
また、2点質問なのですが
-rとはフレーム率を変更する際に使用するなオプションになるのでしょうか?
フレーム率についてよくわかっていないのですが、30.00と29.97とでは大きく差がないのでしょうか?
> -rとはフレーム率を変更する際に使用するなオプションになるのでしょうか?
おっしゃる通りです。
> フレーム率についてよくわかっていないのですが、30.00と29.97とでは大きく差がないのでしょうか?
大きく差がないとは言え、長い動画になればなるほどずれが生じますので、合わせた方がいいと思います。
ちなみにフレームレート(フレーム率)は、1秒間に何枚の静止画を使って動画を表示しているかを表していて、Frame Per Secondの略でFPSと表します。30FPSと29.97FPSなら1秒間に30枚画像が切り替わるか、29.97切り替わるかの違いです。
該当の記事の更新と-rオプションについての記事も追加しました。
ffmpeg:動画のフレームレート(fps)を強制的に変更して出力したい
https://torisky.com/ffmpeg%ef%bc%9a%e5%8b%95%e7%94%bb%e3%81%ae%e3%83%95%e3%83%ac%e3%83%bc%e3%83%a0%e3%83%ac%e3%83%bc%e3%83%88%ef%bc%88fps%ef%bc%89%e3%82%92%e5%bc%b7%e5%88%b6%e7%9a%84%e3%81%ab%e5%a4%89%e6%9b%b4%e3%81%97/