web-dev-qa-db-ja.com

ffmpegで特定のビデオフレームをカットしてフレームレートを変換する方法は?

数日後、ffmpegで問題が発生し、実際に私を怒らせています...ビデオファイルの特定の短いセグメント(60fpsで撮影)を抽出するためにFFMPEGのfilter_complexを使用しようとしています。カットに使用したい元のフッテージの正確なフレームを知っています。各スニペットの速度を変更したい場合は、 trim filterコマンドを setpts と一緒に使用します。実際の場合、最初のスニペットを元の速度(1.0)にしたいので、結果の出力ビデオは元のフッテージ60fpsではなく30fpsにする必要があります。これが私が使用しているコードです:

ffmpeg -y -i footage60fps -filter_complex " 
[0:v]trim=start_frame=28:end_frame=82,setpts=PTS-
STARTPTS,setpts=1.0*PTS[v0]; 
[0:v]trim=start_frame=10:end_frame=20,setpts=PTS-
STARTPTS,setpts=2.0*PTS[v1]; [v0][v1]concat=n=2:v=1:a=0[out] " -map [out] -
preset ultrafast -r 30 output30fps.mp4

私が期待している結果は、最初のスニペット(フレーム28から82の前の最後まで)で、ffmpegが通常の速度で60fpsから30fpsに変換するために2フレームごとにドロップすることです:[28] [x] [30] [x] [32] [x] ... [80]

ただし、得られる結果は次のとおりです。[28] [29] [30] [31] [x] [33] [x] [35] [x] ... [81]

誰かがこの振る舞いを理解していますか?どうすれば解決できますか?ささいな問題のように思えますが、音楽などをシャープにカットするのはとても面倒です...どんな助けでも大歓迎です!

使用する

ffmpeg -y -i footage60fps -filter_complex " 
[0:v]trim=start_frame=28:end_frame=82,setpts=PTS-STARTPTS,framestep=2[v0]; 
[0:v]trim=start_frame=10:end_frame=20,setpts=PTS-STARTPTS,setpts=2.0*PTS[v1];
[v0][v1]concat=n=2:v=1:a=0[out]" -map [out] -r 30 -preset ultrafast output30fps.mp4

表示される動作の理由については調べていませんが、このような異なるレートストリームをconcatフィルターと混合し、CFRレート適合性を適用すると、フレームドロップのリズムが常に期待どおりになるとは限りません。

0
Gyan