VFR to CFR Converter
Convert screen recordings and phone videos with a variable frame rate (VFR) to a constant frame rate (CFR). The tool first reads the frame rates from the file, and can also check frame intervals in the first 30 seconds.
fps filter duplicates or drops video frames before H.264 encoding; audio is re-encoded to AAC 160 kbps. This does not repair existing audio drift or missing frames. The automatic rate is a suggestion. Choose the rate required by your recording, editor or delivery settings, then check the start, middle and end of the output.
Equivalent FFmpeg command
CLI command for your current settings. Updates live as you change controls.
ffmpeg -y -i input-1.mp4 -map 0:v:0 -map "0:a:0?" -vf "fps=30,scale=trunc(iw/2)*2:trunc(ih/2)*2" -c:v libx264 -preset veryfast -crf 22 -pix_fmt yuv420p -c:a aac -b:a 160k -movflags +faststart output-2.mp4 What to do next
How to use
- Drop a videoMP4, MOV, WebM, MKV and more, up to 500 MB and 15 minutes. The average fps and base rate (tbr) appear first, but these two values alone cannot tell you whether frame intervals are even.
- Inspect frame intervals when neededPress Check frame intervals in the first 30 s to decode up to the first 30 seconds and count uneven intervals. Later parts of the video, and the cause of any audio drift, are not checked.
- Pick the output rateMatch your recording settings or your editor's project settings. Auto is a suggestion taken from the file information.
- Convert and downloadVideo is re-encoded to H.264 and audio to AAC 160 kbps. The result shows the output fps / tbr, and the file name gets a suffix such as _cfr30.
Recommended settings
When it goes wrong
The header suggests VFR but sampled intervals are nearly constant
Cause: The header values are estimates, and the interval check only looks at the first 30 seconds. They measure different things.
Fix: The first 30 seconds cannot tell you about the whole file or the cause of audio drift. If the offset is the same from start to end, the Audio Sync tool can shift the audio.
The converted video plays faster or is shorter (hand-written CLI)
Cause: An -r placed before the input ignores the original timestamps and writes new ones at that rate.
Fix: To keep the original timing while making the intervals regular, put -vf fps=30 after the input, and check the output duration.
The output is larger than the input
Cause: Size depends on the number of frames, the CRF and the picture content. Re-encoding at a higher quality setting than the original can make the file bigger.
Fix: Raise the CRF while checking the result, or compress to a target size with the Video Compressor.
The first 30 seconds are CFR but audio drifts later
Cause: Checking only the beginning cannot show what happens to timestamps or sound later.
Fix: Compare the section where it drifts, and check whether the original drifts too. VFR is not the only possible cause.
The video exceeds the 15-minute limit
Cause: The tool handles videos up to 15 minutes. Shorter videos can also fail if the device runs out of memory.
Fix: Keep the original and run the commands below with desktop FFmpeg.
Questions
What is variable frame rate (VFR)?
Video whose frames are not shown at even intervals. With correct timestamps and a player that supports it, VFR plays normally. Convert when your editor needs CFR or when you see an actual problem.
Will this really fix my audio sync?
Not necessarily. The fps filter duplicates or drops video frames according to their original timestamps; it does not re-align the sound with the picture (the audio is re-encoded to AAC). A constant offset and drift that grows over time need different fixes.
Does it change the speed or duration?
No. The fps filter keeps the original timing and only changes how many frames there are. The handling of the last frame can make the video and audio end very slightly apart. Compare the start, middle and end with the original.
Which rate does Auto choose?
The base rate (tbr) if it is close to a standard rate, otherwise the standard rate nearest the average fps. tbr is an estimate, so if you know your recording or project settings, use those instead.
Can this be done without re-encoding?
No. Making a file CFR means adding or dropping frames, and `-c:v copy` keeps the original timestamps. With desktop FFmpeg the audio can be copied as is with `-c:a copy`. This tool converts audio to AAC 160 kbps so that WebM (Opus) and MKV (FLAC) sources also become an MP4 that plays widely.
Should I pick 29.97 or 30?
Match the source standard and your editor's settings. The fps filter adds or drops frames to keep the original timing, so the duration stays the same with either choice. 29.97 fps is set as 30000/1001.
Does it work with iPhone HEVC video?
It reads HEVC video and converts it to H.264, but some profiles or low device memory can make it fail. Try a short copy first, and check HDR colors and orientation.
How are irregular intervals counted?
The tool reads presentation times (pts_time) in up to the first 30 seconds and measures the gap between neighboring frames at 0.1 ms resolution. A gap more than 5% (at least 1.5 ms) away from the most common gap counts as irregular, and above 2% irregular gaps the result shows Variable intervals in sample. This tolerance allows for small rounding in timestamps; it is not a whole-file classification or proof of recording intent.
More detail (settings, limits, FFmpeg commands)
What each setting means
Browsers and limits
- Up to 500 MB and 15 minutes. For larger files, run the commands above with desktop FFmpeg
- The interval check covers only up to the first 30 seconds. Later timestamps and audio sync need to be checked separately
- Output is always MP4 (H.264 + AAC). ProRes or lossless output needs desktop FFmpeg
- Subtitles are dropped, and only the first audio track is kept
The same job with the FFmpeg command line
ffmpeg -i input.mp4 -map 0:v:0 -map 0:a:0? -vf fps=30 -c:v libx264 -preset veryfast -crf 22 -pix_fmt yuv420p -c:a aac -b:a 160k -movflags +faststart output.mp4 ffmpeg -i input.mp4 -fps_mode cfr -r 30 -c:v libx264 -crf 20 -pix_fmt yuv420p -c:a copy output.mp4 ffmpeg -i input.mp4 -vf fps=30000/1001 -c:v libx264 -crf 20 -pix_fmt yuv420p -c:a copy output.mp4 ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate,avg_frame_rate -of default=nw=1 input.mp4 ffprobe -v error -select_streams v:0 -read_intervals %+30 -show_entries frame=pts_time -of csv=p=0 input.mp4 "Average ≠ base" is a clue, not proof
The fps and tbr in the file information are only clues. A mismatch alone does not prove VFR or broken timestamps, and matching values do not prove even intervals. The FFmpeg stream definition calls the base rate (r_frame_rate) a guess.
Checking frame times in the first 30 seconds shows how even the intervals are in that range. The result uses this tool's tolerance and does not guarantee that the whole file is CFR.
Distinguish the fps filter from input-side -r
The fps filter duplicates or drops frames based on the original timestamps. Output-side -fps_mode cfr with -r also gives a constant rate, but the rounding and the handling of the last frame can differ.
An -r placed before the input ignores the original timestamps and writes new ones. If the original intervals were uneven, the duration can change. This is different from setting the frame rate of an image sequence. See the official -r and -fps_mode documentation.
Choose using recording and project settings
An average of 12 fps does not tell you whether the recording was meant to be 30 fps. Check parts with a lot of motion, and do not drop needed frames with an output rate that is too low. Duplicating frames at a higher rate does not make motion smoother either.
Auto uses the base rate as a clue; it does not show the recording settings. Check your editor's settings too. The fractional rates are 30000/1001 for 29.97 and 60000/1001 for 59.94. Making frame intervals regular is different from speeding up playback.