Remove Duplicate Frames from a Video

Pick a video — repeated frames are detected and dropped in your browser, so the file shrinks and the timing stays clean. Nothing is uploaded.

Try:
De-duplicated video

Drop the frames that never changed

Screen recordings, slideshow exports, tutorial captures and animation renders spend most of their length showing the same picture. A 60 fps capture of you reading a page for five seconds is 300 frames of one image. Load the clip here and every consecutive repeat is detected and removed — the file gets smaller and the timeline stops being a wall of identical frames. Everything runs with ffmpeg inside your browser tab: nothing is uploaded, and the tool is free.

Detection uses ffmpeg's mpdecimate filter. It splits each frame into 8×8 blocks and compares it with the last frame it kept: if no block changed more than the hi threshold, and fewer than frac of the blocks changed more than lo, the frame is a duplicate and goes.

The controls

Worked example

demo.mp4 is a 3-second, 10 fps screen capture: 30 frames, but only three distinct pictures — one per second. Load it with the defaults (sensitivity 50, timing Keep timing) and you get demo-dedup.mp4 with 3 frames instead of 30, still playing over the original three seconds. Switch Timing to Compact and the same clip becomes 3 frames over 0.3 s — the pauses are gone. The URL /tools/video-dedup-frames/?sensitivity=70&timing=compact deep-links to that second setup with the fields pre-filled.

Notes and limits

FAQ

Is my video uploaded to a server?

No — ffmpeg runs inside your browser tab, so the file never leaves your device. Nothing is uploaded and nothing is stored.

Why did my video get barely smaller?

Two common reasons. First, the source may have no real duplicates: camera footage with grain changes slightly in every frame — raise the Sensitivity to 70+ and re-run. Second, the file may be mostly audio: a 3-second clip whose video shrinks from 30 frames to 3 barely changes size if an AAC track dominates the bytes. Check the reported output size before and after.

What is the difference between Keep timing, Constant and Compact?

Keep timing removes the duplicates but leaves each surviving frame where it was, so the clip runs for the same length with a variable frame rate. Constant frame rate re-holds those frames on an even grid, which editors prefer — the repeats come back as exact copies that compress to almost nothing. Compact also removes the time the duplicates occupied, so the clip gets shorter and plays back as a fast recap of everything that changed (audio is dropped).

Should I set a max frame rate as well?

Only if the source rate is higher than you need. A 60 fps screen capture of a document rarely needs more than 30 fps, and capping first makes the duplicate scan cheaper. The cap is applied before the scan, so it can never add frames to the output — if your source is already slower, the cap does nothing.

What does the frac setting really control?

frac is mpdecimate's own threshold for how much of the picture has to move. At the default 0.33, roughly a third of the 8×8 blocks must change before a frame is considered new. If your recording only changes in a small region — a mouse pointer, a caption, a progress bar — that never reaches a third of the frame, so those frames get dropped; lower frac to about 0.05 to keep them.

Which formats can I use, and how big can the file be?

Anything ffmpeg can read: mp4, mov, m4v, mkv and webm are the common cases. With Auto, mp4/mov/m4v/mkv keep their container and everything else comes out as MP4; you can also force MP4 or WebM. The input and the output are each capped at 25 MB.

Can I get an animated GIF out?

Not here — GIF export needs its own palette pass to look right, so it lives in a dedicated video-to-GIF tool. De-duplicate first, then convert the result: the GIF ends up smaller because the repeated frames are already gone.

Developer & Automation Access

Run it from the terminal

Same engine as this page, headless — via the gizza CLI:

gizza tool video-dedup-frames 'url=https://example.com/input' 'sensitivity=50' 'timing=keep' 'max_fps=30' 'format=auto' 'frac=0.33'

New to the CLI? Get gizza →

Open it by URL

Pre-fill and auto-run this tool with query parameters — the names match the API/CLI:

https://gizza.ai/tools/video-dedup-frames/?url=https://example.com/input&sensitivity=50&timing=keep&max_fps=30&format=auto&frac=0.33

Machine-readable descriptor: tool.json — title + parameters JSON Schema for agents.