Changing frame rate means adding or removing frames. The fps filter is the clean way to do it — it duplicates or drops whole frames to hit the target rate without changing playback speed. (To change speed instead, that's the setpts/atempo approach.)
Key takeaways
fps=30retimes to 30 frames per second, keeping the same duration.- Lowering fps drops frames; raising it duplicates them.
-fps_mode cfrforces a constant frame rate from variable-fps sources.minterpolatesynthesizes in-between frames for true smoothing.
Convert to a target frame rate
The most common case — bring 60fps down to 30fps, or set any target:
# 60fps -> 30fps (drops every other frame) ffmpeg -i in.mp4 -vf "fps=30" -c:a copy out.mp4 # raise to 60fps (duplicates frames) ffmpeg -i in.mp4 -vf "fps=60" -c:a copy out60.mp4
Force a constant frame rate (VFR → CFR)
Screen recordings and phone footage are often variable frame rate, which can desync audio in editors. Force a constant rate:
ffmpeg -i in.mp4 -vf "fps=30" -fps_mode cfr -c:a copy out.mp4
Interpolate smoother motion
Plain frame duplication looks choppy. minterpolate generates genuinely new in-between frames using motion estimation — slow to render, but smooth:
# interpolate up to 60fps for fluid motion ffmpeg -i in.mp4 -vf \ "minterpolate=fps=60:mi_mode=mci:mc_mode=aobmc" -c:a copy smooth.mp4
Change frame rate visually instead
FFmpegLab exposes a frame-rate selector and writes the matching fps command for you, with the option to force constant frame rate on troublesome recordings — all offline. Want to actually retime a clip? See speed up & slow down, then compress.