FFmpeg recipe

FFmpeg: Change a Video's Frame Rate

fps=30 simply drops or duplicates frames to hit the target rate. For smoother motion (slow-mo, time-warp), use minterpolate instead.

Command

ffmpeg -i input.mp4 -vf fps=30 -c:v libx264 -crf 23 -c:a copy -y output_30fps.mp4
Prefer no terminal?
Use the FPS Converter in your browser
Open FPS Converter →

What each flag does

-iInput file. Can be a video, audio, or image. Repeat for multiple inputs.
-vfVideo filter chain. e.g. scale=1280:720, crop=, fps=30.
-c:vVideo codec for output. e.g. libx264, libx265, libvpx-vp9.
-crfConstant Rate Factor — quality target (lower = better, larger file). 23 is visually lossless for libx264.
-c:aAudio codec for output. e.g. aac, libmp3lame, copy.
fps=30Target frame rate. fps filter does naive drop / duplicate — safe but not motion-interpolated.

Notes & gotchas

  • For smooth motion interpolation, use -vf "minterpolate=fps=60:mi_mode=mci". Slow but pretty.
  • For inverse telecine (24p in 60i), see -vf pullup,fps=24000/1001.

Check it worked

ffprobe -v error -show_entries stream=r_frame_rate -of csv=p=0 output.mp4

The target rate as a fraction, for example 30/1.

What to change

Going down duplicates nothing, going up doesfps=30 from 60 drops frames cleanly. fps=60 from 30 repeats them, which looks identical and doubles the size.
minterpolate for real smoothingIt invents intermediate frames rather than repeating them. It is slow and produces artefacts around fast edges.
Audio is untouchedChanging frame rate this way does not alter duration or pitch. That is setpts, and a different recipe.

If it fails

Motion looks stuttery after converting to a higher rate.

Why: Frames were duplicated rather than generated, so there is no new motion information.

Fix: Use the minterpolate filter to synthesise intermediate frames, which is far slower but genuinely smoother.

Audio no longer lines up with the picture.

Why: The frame rate was changed by altering the timebase, which stretched the video against a fixed audio track.

Fix: Use the fps filter, which resamples frames while leaving duration alone, rather than setting -r on its own.

Related recipes