ffmpeg を使用してビデオフレームをカットし、フレームレートを変換するにはどうすればよいですか?

ffmpeg を使用してビデオフレームをカットし、フレームレートを変換するにはどうすればよいですか?

数日前からffmpegで問題が発生し、本当に困っています...FFMPEGのfilter_complexを使ってビデオファイル(60fpsで撮影)の特定の短いセグメントを抽出しようとしています。カットに使用したい元の映像の正確なフレームはわかっています。トリムフィルターコマンドと設定各スニペットの速度を変更したい場合、実際には最初のスニペットを元の速度 (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 が 2 番目ごとにフレーム ([x]) をドロップして、通常の速度で 60fps から 30fps に変換することです: [28][x][30][x][32][x]...[80]

しかし、私が得た結果は次の通りです: [28][29][30][31][x][33][x][35][x]...[81]

この動作を理解している方はいますか? どうすれば解決できますか? 小さな問題のように思えますが、音楽などをシャープにカットするときに非常に煩わしいことがわかりました... どのような助けでも大歓迎です!

答え1

使用

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

表示される動作の理由については調べていませんが、このように異なるレートのストリームを連結フィルターと混合し、CFR レート適合を適用すると、フレーム ドロップの頻度が必ずしも予想どおりになるとは限りません。

関連情報