← All articles

Why Is My Video Stuttering? Duplicate Frames

A clip says 60fps in its properties and moves like 30. Nothing in the metadata is wrong, exactly — the container really does hold sixty frames for every second. It is just that half of them are copies of the one before.

How padding happens

Frame rate conversion is the usual cause. Footage shot at 30fps, dropped onto a 60fps timeline, exported without any interpolation: the encoder has sixty slots to fill and thirty pictures, so it writes each one twice.

The file is now twice the frame rate and exactly as smooth as it was. Everything downstream believes the header.

Screen recorders produce a related version: they capture only when the screen changes, so a still desktop emits long runs of identical frames with a nominal rate stamped on top.

The measurement

Compare each sampled frame with the one a second earlier and count how many are identical. A genuine 60fps capture of moving footage has almost none. A 30-in-60 pad has close to half.

There is a cheaper route that works most of the time: read the packet sizes without decoding anything. A repeated frame compresses to almost nothing — a ~36 byte packet beside a median of ~300KB. That is free, because the container is read anyway.

It is not a replacement, though. The packet trick goes blind in two situations: when duplicates are the majority (the median packet is itself a duplicate, so a 24-to-48fps pad reads 0.0%) and when the encoder spent real bits on the duplicates anyway. So it is used when it finds something, and the decoded comparison is the fallback.

The three things it must never accuse

A still shot. A title card, a slide, a locked-off camera on something motionless — every frame is identical and the frame rate is entirely honest. This check used to tell those files they “claim a frame rate they do not carry”, a causal claim about the file’s history that was simply false. The comparison is now asked only of frames that actually differ from the one a second earlier.

A thin sample. A sample at the end of a file has no next frame to compare against. Counting it as “not a duplicate” produced the memorable result of a one-frame video reported as “every frame is a new picture” — off zero comparisons. Below two real comparisons the check declines entirely, and the measurement line states the count so a thin sample is visible rather than hidden.

An animation hold. Animation deliberately holds a drawing for two or three frames. By measurement that is indistinguishable from a freeze, which is why a finding about repeated frames is worded for both causes and never graded on its own.

What to do about it

If a padded rate is real, the fix is at the export: either output at the rate the footage was actually shot, or use genuine frame interpolation rather than frame duplication. Which one depends on the destination — most platforms are happy with 24, 25 or 30, and padding to 60 only costs bandwidth.

If the stutter is visible but the frames are all distinct, the cause is elsewhere: a variable frame rate the player is struggling with, a rate that does not divide into the display’s refresh, or dropped frames at playback rather than in the file. Those three look identical to the eye and completely different in the container.

No original to compare against? DiffALL measures one file on its own and names what is wrong with it.

Check a file — free