Three ways to change frame rate
You can ask FFmpeg to change frame rate three different ways. They behave differently and the wrong one breaks A/V sync.
- -r <fps> as an output flag — drops or duplicates frames so the video has that many fps. Container timestamps are preserved. Audio sync is preserved.
- -vf fps=<fps> — same idea, expressed as a filter. Use this when chaining with other filters.
- -vf setpts + -af atempo — actually slows down or speeds up the video (see Track 5 lesson 8).
Common conversions
60 fps → 30 fps for upload size: drop every other frame. 24 fps → 60 fps: duplicate frames. Neither interpolates motion (no synthesized in-between frames). For motion interpolation use the minterpolate filter or AI tools (Topaz, RIFE).
Variable frame rate (VFR)
Screen recordings, phone captures, and some streaming sources are VFR — frames arrive whenever the source feels like emitting one. This breaks editors that assume CFR. Convert to CFR with -vsync cfr -r 30 or use fps=30 filter.