Measure judder
Give it one or more videos; get back, per video, a judder score, the median motion step and the number of repeated frames. A frame's motion step is the mean absolute change in brightness from the frame before. Steady motion keeps the step even, so the score sits near 0. A cadence that repeats one frame and then jumps two scores high. Compare takes of the same shot, or a take against the source footage of that shot. Don't compare scores across different shots: the number depends on how much moves.
Run it
Write references/judder.md's script into the project folder as judder.py,
as is, and run it with exec python:
exec python judder.py --videos <source shot>.mp4 <shot>_kling_a.mp4 <shot>_wan_a.mp4
exec python judder.py --videos <take>.mp4 --frames 78 --steps
--frames Nscores only the first N frames. Use the shot's length, so a still hold at the end of an untrimmed render doesn't count.--stepsalso prints every frame's step, to find where a stutter happens.
What you get
JSON per video: judder, median_step, frames, repeats (frames whose step
is under 0.4 of the local median, so they repeat the frame before).
Reading the numbers
- Source footage scored about 0.05, and Kling v3 takes about the same.
- A model whose output was 24 fps content padded to 30 fps (one repeat and one double step in every 5 frames) scored 0.78. After the repeats were dropped and the gap motion-interpolated it scored 0.39, and it still looked jerky. A score several times the source's is visible.
repeatsnear a fifth of the frames, at a 30 fps container, is that padding pattern. Check the frame rate (ffprobe-inspect-media) and suspect the provider's output before the motion itself.- A near-static shot (a talking head; a median step around 0.2) gives a noisy score, or none when the median is 0. Judge those by eye.
Tips and traps
- Measure trimmed takes, or pass
--frames: a hold after the action lowers the median and inflates the score. - A cut inside the clip is one huge step and pushes the score up. Measure one shot at a time.
- Retiming a take (speeding it up to fit) adds judder of its own. Trim it, or re-brief it to act in real time, instead.
- Put the source's score next to each take's on the review page, so the person sees the comparison and not a bare number.
Check it
Run it on the source shot first. It should read near 0.05 with 0 repeats. If it doesn't, the source itself is uneven, and takes have to be read against that number.


