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.mp4Prefer no terminal?
Use the FPS Converter in your browser
What each flag does
| -i | Input file. Can be a video, audio, or image. Repeat for multiple inputs. |
|---|---|
| -vf | Video filter chain. e.g. scale=1280:720, crop=, fps=30. |
| -c:v | Video codec for output. e.g. libx264, libx265, libvpx-vp9. |
| -crf | Constant Rate Factor — quality target (lower = better, larger file). 23 is visually lossless for libx264. |
| -c:a | Audio codec for output. e.g. aac, libmp3lame, copy. |
| fps=30 | Target 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.mp4The target rate as a fraction, for example 30/1.
What to change
| Going down duplicates nothing, going up does | fps=30 from 60 drops frames cleanly. fps=60 from 30 repeats them, which looks identical and doubles the size. |
|---|---|
| minterpolate for real smoothing | It invents intermediate frames rather than repeating them. It is slow and produces artefacts around fast edges. |
| Audio is untouched | Changing 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.