Using ffmpeg to change framerate – Stack Overflowより、H.264, H.265 の映像を再エンコードせずにフレームレート(fps)を変更する方法。映像のフレームレートだけなので音声は再エンコードしないと速度を変えられない。音声の速度変更はatempo, rubberbandフィルタのどちらかを使う。

公式wikiにも記載された。
How to speed up / slow down a video – FFmpeg

【ffmpeg】倍速再生できる動画にエンコードする
サンプリング周波数を変えずにテンポとピッチを変える rubberband

元映像のフレームレートよりも入力フレームレートを大きくすれば再生速度は速く、動画時間は短くなる。反対に入力フレームレートを小さくすれば再生速度は遅く、動画時間は長くなる。同様に本当のフレームレートが30000/1001なのに、30でエンコードされている動画の修正にも使える。

H.264 の場合。
ffmpeg -i input.mp4 -c copy -bsf:v h264_mp4toannexb output.h264
ffmpeg -fflags +genpts -r 12 -i output.h264 -c copy output.mp4
ffmpeg -fflags +genpts -r 36 -i output.h264 -c copy output.mp4

音声も合わせるなら映像の速度に合わせてatempoも揃える。
ffmpeg -fflags +genpts -r 36 -i output.h264 -i input.mp4 -filter_complex [1:a]atempo=1.5[a] -map 0 -c:v copy -map [a] -c:a aac output.mp4

H.265 の場合。
ffmpeg -i input.mp4 -c copy -bsf:v hevc_mp4toannexb output.h265
ffmpeg -fflags +genpts -r 12 -i output.h265 -c copy output.mp4
ffmpeg -fflags +genpts -r 36 -i output.h265 -c copy output.mp4

video – Change framerate in ffmpeg without reencoding – Super Userより、-itsscaleを使う方法もある。こちらはH.264、H.265に限らず、VP9やAV1でもフレームレートを変えられる。

30を30000/1001に修正するには、30/(30000/1001)=1.001で少数を指定する。逆に音声フィルタはその逆数を指定する。
ffmpeg -itsscale 1.001001 -i input -af "rubberband=(30000/1001)/30" -r 30000/1001 -c:v copy -c:a aac -b:a 128k output.mp4

How do I speed up a video by 60X in ffmpeg? – Super User
video – using ffmpeg to convert 60fps to 29.97fps without dropping frames – Super User

ffmpeg 4.4からはビットストリームフィルタでPTSを書き換えられるようになったので再エンコードコード不要で映像の再生速度を変更できる。以下の例は2倍速。setts=TS/再生速度で指定する。
ffmpeg -i input -af "atempo=2" -bsf:v setts=ts=TS/2 -c:v copy output

公式ドキュメント:FFmpeg Bitstream Filters Documentation : setts

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

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