How to Change Video Frame Rate with FFmpeg

Different platforms demand different frame rates. A 60fps screen recording won't fly on a broadcast system expecting 29.97fps, and uploading 24fps cinema footage to a platform that expects 30fps can cause playback stutters. FFmpeg gives you several ways to handle frame rate conversion, but the options can be confusing. This guide covers the practical approaches that actually work.
Quick answer: To change a video's frame rate to 30fps with FFmpeg, run ffmpeg -i input.mp4 -r 30 output.mp4. This re-encodes the video and adjusts the frame timing to match the new rate.
Check Your Current Frame Rate
Before converting anything, check what you're working with. Use ffprobe to inspect the video:
ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate,avg_frame_rate -of default=noprint_wrappers=1 input.mp4
This prints both the stream's base frame rate (r_frame_rate) and the average frame rate (avg_frame_rate). You'll see output like:
r_frame_rate=30/1
avg_frame_rate=30/1
A value of 30/1 means exactly 30fps. You might also see 30000/1001, which is the NTSC standard 29.97fps. Knowing your source frame rate helps you pick the right conversion approach.
Change Frame Rate with the -r Flag
The simplest way to change frame rate is the -r output flag. Place it after your input file:
ffmpeg -i input.mp4 -r 24 output.mp4
This re-encodes the entire video and sets the output to exactly 24fps. FFmpeg automatically drops or duplicates frames to hit the target rate. If your source is 60fps and you target 24fps, FFmpeg drops roughly 60% of the frames. If you go the other direction, from 24fps up to 60fps, it duplicates frames to fill the gaps.
The -r flag is the go-to method for most frame rate conversions. It handles the math for you and keeps audio in sync automatically.
Change Frame Rate with the fps Filter
For more control over how frames are selected during conversion, use the fps video filter:
ffmpeg -i input.mp4 -vf "fps=60" output.mp4
The fps filter lets you specify rounding behavior, which matters when the source and target frame rates don't divide evenly. You can control how FFmpeg rounds timestamps:
ffmpeg -i input.mp4 -vf "fps=fps=30:round=near" output.mp4
The round parameter accepts near (nearest, the default), up, down, and zero (round toward zero). This level of control is useful when you need frame-accurate output for editing workflows or broadcast delivery.
Both the -r flag and the fps filter re-encode the video. There's no way to change frame rate without re-encoding, since the frame timing data is baked into the compressed stream.
Common Frame Rates and When to Use Them
| Frame Rate | Common Name | Typical Use |
|---|---|---|
| 24fps | Film | Cinema, narrative content, film-look videos |
| 25fps | PAL | European broadcast television |
| 29.97fps | NTSC | North American broadcast television |
| 30fps | Web | YouTube, social media, web video |
| 60fps | High frame rate | Gaming footage, sports, smooth motion |
Most web video does fine at 30fps. If you're targeting YouTube or social platforms, 30fps is a safe default. For cinematic content, 24fps gives you that film-look cadence. And if you're working with broadcast delivery, match the regional standard: 29.97fps for NTSC territories, 25fps for PAL.
Frame Rate Conversion via API
If you're building frame rate conversion into an application or pipeline, the FFmpeg Micro API lets you run FFmpeg operations over HTTP without managing servers or FFmpeg installations.
curl -X POST https://api.ffmpeg-micro.com/v1/transcodes \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"inputs": [{"url": "https://example.com/input.mp4"}],
"outputFormat": "mp4",
"options": [
{"option": "-r", "argument": "30"}
]
}'
The API accepts the same FFmpeg flags you'd use on the command line. The options array takes objects with option and argument fields. You point it at a source URL, specify your output format, and get back a processed file.
This is especially useful when you need to normalize frame rates across user-uploaded content, or when your backend needs to convert video without installing FFmpeg on every server.
Try frame rate conversion via API. You can get a free API key at ffmpeg-micro.com.
Common Pitfalls
Input -r vs. output -r. Placing -r before the input file changes how FFmpeg interprets the source timing, not the actual output frame rate:
# This changes input interpretation, NOT output frame rate
ffmpeg -r 15 -i input.mp4 -c copy output.mp4
This is mainly useful for raw video or image sequences where there's no embedded timing information. For normal video files, always place -r after the input (-i) to set the output frame rate.
Frame duplication is not interpolation. When you upscale from 24fps to 60fps, FFmpeg duplicates existing frames. It doesn't generate new in-between frames. The result looks identical to the 24fps source, just with repeated frames. If you need actual motion interpolation (generating new frames between existing ones), you'd need the minterpolate filter, which is significantly slower and sometimes produces artifacts.
Audio stays synced. Both the -r flag and the fps filter keep audio in sync automatically. FFmpeg adjusts the video timeline without touching the audio stream. You don't need to add any extra flags for audio synchronization during frame rate conversion.
FAQ
Does changing frame rate affect video quality?
Changing frame rate requires re-encoding, which means a generation loss in quality. You can minimize this by using a high-quality codec like H.264 or H.265 with a reasonable CRF value (e.g., -crf 18). But going from 60fps down to 24fps means permanently discarding 60% of your frames.
Can I change frame rate without re-encoding?
No. Frame rate is embedded in the video stream's timing data. You can't change it with -c copy (stream copy) in any meaningful way. The video must be decoded and re-encoded with the new frame timing.
What happens to variable frame rate (VFR) video?
Screen recordings and phone videos often use variable frame rate. Running them through FFmpeg with -r 30 or -vf "fps=30" converts them to constant frame rate (CFR), which fixes many editing and playback issues. This is actually one of the most common reasons to do a frame rate conversion.
How do I convert 29.97fps to exactly 30fps?
Use the fractional notation: ffmpeg -i input.mp4 -r 30 output.mp4. If your source is 29.97fps (30000/1001), FFmpeg handles the slight timing adjustment. For the reverse, targeting NTSC: ffmpeg -i input.mp4 -r 30000/1001 output.mp4.
Should I change frame rate before or after other edits?
Do your frame rate conversion early in the pipeline, especially if you're also changing video speed or cropping and resizing. Converting frame rate first gives your other filters a consistent time base to work with. If you're extracting frames from the video, convert the frame rate first so you get the right number of output images.
About Javid Jamae
Founder & CEO at FFmpeg Micro
Javid is a software engineer, author, and entrepreneur with over 25 years of professional software development experience across enterprise, startup, and consulting environments. He founded FFmpeg Micro to make video processing accessible to developers through a simple, automation-first REST API.
You might also like

How to Speed Up or Slow Down Video with FFmpeg
Learn how to change video speed with FFmpeg using setpts and atempo filters. Covers 2x speedup, slow motion, audio sync, and API-based processing.

How to Crop and Resize Video with FFmpeg
Learn how to crop and resize video with FFmpeg using scale, crop, and pad filters. Includes CLI commands, API examples, and TikTok/Reels presets.
How to Extract Frames from Video with FFmpeg
Extract single frames, generate thumbnails, and pull keyframes from video using FFmpeg. Verified commands with real benchmarks and output sizes.
Ready to process videos at scale?
Start using FFmpeg Micro's simple API today. No infrastructure required.
Get Started Free