ffmpegvideo-processingframe-ratefpsbucket-doc

How to Change Video Frame Rate with FFmpeg

·Javid Jamae·6 min read
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 RateCommon NameTypical Use
24fpsFilmCinema, narrative content, film-look videos
25fpsPALEuropean broadcast television
29.97fpsNTSCNorth American broadcast television
30fpsWebYouTube, social media, web video
60fpsHigh frame rateGaming 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.

Software EngineeringVideo ProcessingFFmpegCloud ArchitectureAPI DesignAutomation

Ready to process videos at scale?

Start using FFmpeg Micro's simple API today. No infrastructure required.

Get Started Free