今まで ffmpeg は異なるフレームレートの動画を1つに出力するのはできないと思っていたが、あらかじめ異なるフレームレートにエンコードしておいて、その後に連結すれば VFR の動画になる。

方法は以前書いた demuxer の concat を使えば楽に VFR の動画になる。注意点は映像音声ともに同じコーデックで同じエンコード設定、音声は同じサンプリング数であること。ただし動画によっては「Non-monotonous DTS in output stream 0:0」のエラーが出るが再生して問題なかったら気にしない。

concat を使い分ける
【ffmpeg】動画・音声を連結する concat の使い方 其の3
再エンコードせずに fps を変更する
ffmpeg で使える映像のテストソース

ffmpeg -f concat -safe 0 -i 24-30.txt -c copy vfr.mp4

24-30.txt

file 24p.mp4
file 30p.mp4
file 24p.mp4


動画へのファイルパスはシングルクオート(’)で挟む。

file 'E:/video/24p.mp4'
file 'E:/video/30p.mp4'
file 'E:/video/24p.mp4'

再生してファイルがおかしい場合は H.264, H.265 の raw コンテナに入れてみる。
ffmpeg -i 24p.mp4 -c copy -an 24p.264
ffmpeg -i 30p.mp4 -c copy -an 30p.264

映像と音声を合わせる
ffmpeg -f concat -safe 0 -i raw.txt -f concat -safe 0 -i 24-30.txt -map 0:v -map 1:a -c copy vfr.mp4

raw.txt

file 24p.264
file 30p.264
file 24p.264

動画サンプル作成コマンド
ffmpeg -f lavfi -i testsrc2=r=24000/1001:d=10 24p.mp4
ffmpeg -f lavfi -i testsrc2=r=30000/1001:d=10 30p.mp4

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)