← All posts

Guides

How to Check for Duplicate Frames in AI Video

Check duplicate frames in AI video with a 24-slot stepper and 48 decoded captures. Separate exact image repeats from motion defects and playback drops.

A bottle turns toward the light. The highlight pauses for an instant, then jumps across its shoulder. The file inspector says 24 fps. Before asking for another generation, an editor needs to answer a smaller question: did the file hold the same picture twice, did the object move unevenly between different pictures, or did playback skip a picture on this device?

To check for duplicate frames in AI video, start with the video track’s timing, compare adjacent decoded pictures in the suspect interval, then watch the motion in context. A frame-rate label describes a timing relationship. It gives no assurance that the subject changes position at every step. Conversely, two different pictures can contain almost the same pose.

Read first. Check that the file, duration and track inventory match the deliverable you intend to review. Token360’s video output validation guide.

How can a 24 fps sequence contain repeated pictures?

A sequence can assign each picture a new display time while reusing its visual content. Imagine a one-second animation with 24 slots. Moving a dot to a new position in every slot produces 24 positions. Moving it only on alternate slots and holding each position twice produces 12 positions over the same second. Both timelines have 24 slots.

The static comparison below lists the positions in the first six slots. The advancing sequence changes every slot; the held sequence repeats each position twice. This isolates the hold without depending on monitor refresh rate.

SlotEvery slot advancesEach pose held twice
100
210
322
432
544
654
Six time slots show six advancing positions on one row and three positions held twice on another row.
Six-slot excerpt from a constructed example. The dots represent positions, and the columns represent equally spaced times.

A repeated image can be intentional. A title card, a product freeze or a deliberately stepped animation may call for a hold. The practical concern is an unexpected hold during a move that should appear continuous. Mark the time and write down what the shot is supposed to do there. That gives the next reviewer a question more precise than “does it look choppy?”

What did we check in two archived MP4s?

We inspected an eight-second bottle reveal and a slow river glide from Token360’s editorial archive on November 3, 2026. In both MP4 video tracks, the media timescale was 12,288 ticks per second. The decoding-time table contained one run of 193 samples, each lasting 512 ticks. Dividing 12,288 by 512 gives 24 sample intervals per second. The 193 intervals span about 8.04 seconds.

That establishes a regular decoding schedule for these tracks. Picture presentation order can involve additional timing information. For the image comparison we therefore sought on the browser’s media timeline and captured the displayed picture. We did not assume that reading compressed packets in file order would give the intended visual sequence.

In desktop Chrome we paused each clip, sought to the middle of each of 24 equal intervals in its first second and waited for the seek to finish. The first requested time was 1/48 second, the last 47/48. At each point we drew the displayed image at its native dimensions onto a canvas and computed a SHA-256 digest of the RGBA pixel bytes. Each source contributed 24 captures and 23 adjacent comparisons.

Source and intervalCapturesDistinct pixel digestsEqual adjacent pairs
Bottle reveal, first second24240 of 23
River glide, first second24240 of 23

Across the two excerpts, none of the 46 adjacent comparisons found identical decoded pixel arrays. This is a small, positive finding about the particular intervals and decode path. It leaves plenty of room for a motion problem. A flickering reflection or a few changing water pixels can give every capture a distinct digest while the main subject remains practically still. The rest of both files was outside the image test.

Copy frame-check.csv from the complete source below

source,slot,requested_seconds,sha256_rgba
river,1,0.02083333,f5bf49a67ce783834e8757c281a40b8dd0cd4803f405d6b51d813c5cad481653
river,2,0.06250000,5209e05a027fdf3f1b212194ef74d26e0421264a4f8552fcaac9f55d5981b7de
river,3,0.10416667,ff5ea863ab4ddad5a74b20df67c3ed0a19481d873eb24addffe18485a38b8812
river,4,0.14583333,755c656c596ed29a5ceb1385d406f7db0c9a7425996e4137b7945ecb76921d75
river,5,0.18750000,17290032261aaf2861f3b2a65a43e0babe38667bf30a7099b43fd541d8a9fd90
river,6,0.22916667,4a2f96428890003c532fdcfbc55dbe2ebe7aee60d2d2b39fdc8822880f5dfbad
river,7,0.27083333,9c8dd02381c274b88600638360560eff4c5f458a9d1f9ee3c9aaf368836b94ad
river,8,0.31250000,075f50e13e3e4970671457902c76d943703bf329ea874ee232a89810c1186fcd
river,9,0.35416667,93f0ea60e3c695fe34d2ae5a237928d5bdf5b380633970ffd81ed100cb754e37
river,10,0.39583333,9ba92e47e9121f7694b7ac037850a95d3909fd175023594ace0c8cf3660e6cb8
river,11,0.43750000,3d5217ae02de3d31e743cdfdc57df389c82d545a1c822aacaa8c884cc8b206df
river,12,0.47916667,88c94410b640d82f438397d9578939cbab56d1645915b664f3e5a0a8924873e2
river,13,0.52083333,0a954bff0586b274ab509b7ee5e07653abaffe829d961121d667c499d7d49b10
river,14,0.56250000,130df759333dd49f22376d04244ac24eebd0e9f0a3bde580cd8c184fa84d5629
river,15,0.60416667,16306bda58b0b22a46f24f50b7dce81b7d7a64c8e1bb27d31bbadabcf001e864
river,16,0.64583333,3bd3265c7b847049dd2aae31388346b5d95e255a8e66db22e36ea5a7c713ad27
river,17,0.68750000,6896eb6ff68f36928965e66a876a7ee88db066cb33a0136b895ab5aba3b1545f
river,18,0.72916667,e2b1e3a5932271a547c376bfbbaf71b109ce961f150f3a74d7f1a8cef1f6e723
river,19,0.77083333,37f4e93cb054b88246c9286ede0d33b5c301d2dd8bb3fefd7ed0d5066eaea723
river,20,0.81250000,a406bfbc70251b0cd5f649393f962f30e7a82e747b59148a90f2dc2854d7aafc
river,21,0.85416667,022737de0d27d45ee01eaa5877ba4ddb3798940a9761b53f80543dd03053a110
river,22,0.89583333,5de937624f3d964ae9a3580c07ec9188502dc91ed69dee30a684e09dc738f412
river,23,0.93750000,906a8bc32d8a119be482bc49eb54fa6fc77489182c48e0f7bbdacb704c47f732
river,24,0.97916667,8131c0346f8f86e02ee958e51b352358115ad7cc446b5a953c13b41e84536e81
bottle,1,0.02083333,d696bab1378d59e90a5263ab98d6cfccb827dd9e7ea23400094a768dd5d20d3e
bottle,2,0.06250000,78f1dc391fdbec642dfe23b489cfa46491995816d7775f64b9dbffe9b5d9bbfb
bottle,3,0.10416667,0e58b9860cb3fd7604ae93ec7de72be5b5197149018ece9d1b1ae26326fc34ea
bottle,4,0.14583333,995aac117c6ba34eb7eec2e5a7b2d7cf4044a8933ccbbaaace6cad3e7bb68905
bottle,5,0.18750000,19f0f9936c3f24c080f0045d892ec32b85a9b01618a59651eba09960be156ae1
bottle,6,0.22916667,669df43ff316589899f4843b0f22f27fc90fbdb42514d3cf2ad50236608119e9
bottle,7,0.27083333,3b6122174124af3b23031131fa84ad189f1624004dda92337eb3ce5a2889a823
bottle,8,0.31250000,e70fdac2ba710b0fc937aed0c48c496d9a3c8bd1f2457ec5004233a92283128a
bottle,9,0.35416667,10dd9c1b38e2a96438ebfafbeccda1302a9edac35e0aacfe80cefb6f498e4a0b
bottle,10,0.39583333,bdb61c3f512a0812267589ae377ab3bd01e3f5f86aebf472fda403bd013a65fe
bottle,11,0.43750000,be725e67502172a2f322fe4a3513de10469ac3885ac0125d2f7b191ce954d110
bottle,12,0.47916667,44fb1436e7b656dc4c498d458fb8323e0190dc04af946fcb47952834fa1ab6c1
bottle,13,0.52083333,7b1398fbf3b2ff1fdf82631e69ac27ee06db8546c4cd0cd2510f4a27dfe6a56a
bottle,14,0.56250000,97cc58f4a324036d33245ce02e260db88df5391bdd9fddfc1a5e7d60a4db7601
bottle,15,0.60416667,939efc5977b6c99d4f38f5db6a8e133e1c567c08584ee11efc7368ac244fe145
bottle,16,0.64583333,296c216f0280ad13a286bb6736692b40cf0eacf0193d13260ddd25ae9c14a0d0
bottle,17,0.68750000,516fc562df6846e56d43448f68fd7a3a6db5430f90eca8173833a0ab57609235
bottle,18,0.72916667,e49d7b209645edd696d53830f2cc68aadec4f1c504bb912ead78a82516bcad7e
bottle,19,0.77083333,91f682fb7e6b5d6bb8703a93aa5a28fcd8df96e3f974566d0bf34142463fe2ad
bottle,20,0.81250000,a4ff0328d74a5a45f1a506787b74c126ec2472fcc1c26e1cd8b727e32b53572a
bottle,21,0.85416667,5c0b5790c54c9a3f7ff965ffedc0fa7853d65c28708869cf4629ba39c8e58743
bottle,22,0.89583333,d0f65d998d8a3b621a3ce3c4d8b97a914150589a45c5d38e52a9a52b32ffb6c3
bottle,23,0.93750000,1b55c53be42239f3f945b8e4e895e196b4f4d72840e8ff876f716885c13476b0
bottle,24,0.97916667,60b804952ac89da505ff7a854f5cf307aaf68518c87a98d4a731b68ac406b059

What counts as an exact duplicate, and what can a hash miss?

An exact duplicate here means that every decoded color and alpha value matches at corresponding positions in two adjacent captures. A digest makes a large pixel buffer convenient to compare. Hashing the MP4 file itself answers a different question about file identity; hashing compressed packets introduces encoding differences that an editor may never see.

For a near-hold, choose a region that represents the approved action. In a product turn, follow the cap edge against the backdrop. In a river glide, pick a stable point on the bank instead of inspecting a moving reflection. Step through neighboring pictures and compare the displacement of that feature. Does it stay near one location for several slots and then move much farther than expected? Save a few consecutive images around the event so a second editor can inspect the same motion.

Keep pixel differences and editorial judgments in separate columns. A small difference might be compression noise, fine texture, a subtle camera move or an intentional pause. No threshold was calibrated in this experiment. Before setting one for a production queue, collect examples your editors consider acceptable and unacceptable under the same viewing conditions.

Tell a file issue from a playback issue

Replay the same interval, then step through the source. A pause that repeatedly appears in the same adjacent pictures deserves asset-level investigation. If the pictures progress normally when stepped and the stutter moves around between playback attempts, inspect the player and device as well.

Browser instrumentation can help separate these observations. A video-frame callback exposes information about frames submitted for composition, including media time and a presented-frame counter. A callback gap is evidence about that observation path. Load on the browser or a difference between display refresh and video rate can influence what you observe. Our paused-seek comparison used a different method and measured no live playback drops. MDN video-frame callback reference.

Three questions distinguish sample timing, adjacent image equality and subject motion during playback.

Which check should you run on a customer’s file?

Use the narrowest check that can explain the complaint. Get the exact export, the suspect time, the expected movement and the playback environment. “The cap holds as the camera pushes in at 00:02” is a much better starting point than regenerating all the shots in a cut.

  1. Inspect timing. Read the video stream and individual frame timestamps. For a variable-rate source, use its actual presentation times. Sampling uniformly at a guessed rate can capture the same displayed picture twice even if the source contains no duplicate image samples. FFprobe documentation.
  2. Check the surrounding pictures. Include at least one image before and after the suspected hold. Keep resolution, pixel format and decoding path fixed for exact comparisons. Note the comparison count as well as the capture count.
  3. Watch the intended motion. Decide whether the hold serves the edit. If delivery requires continuous movement, test a small repair or another take, then inspect the same interval again.

When the delivery file has been converted to a different frame rate, inspect the approved source and the delivery export separately. If the source progresses as expected and the export repeats a picture at the problem time, first investigate the conversion settings. If both versions hold in the same place, the creative team can decide whether the hold belongs to the shot. This distinction can save a paid regeneration and preserve a performance that was already approved.

Frequently asked questions

Does 24 fps guarantee 24 different images every second?

No. Timing and picture content can vary independently. The frame-step example uses two different motion patterns on the same 24-slot timeline.

Why are there 23 comparisons for 24 captures?

The first capture has no preceding capture inside the interval. Each of the remaining 23 is compared with its immediate predecessor. We did not compare across the two different clips.

Can this test detect interpolation?

It checks exact equality in sampled decoded images. An interpolated frame can be distinct while containing deformed edges or implausible movement. Inspect the subject around the affected moment.

Should I delete every repeated frame I find?

Check intent and duration first. Removing pictures can change timing, audio alignment and the length of a shot. Review the revised sequence against the original edit decision.

Would another browser produce the same hashes?

Pixel conversion and decoding paths can differ. Compare captures within one controlled setup and record it. The included digest sheet documents the run used for this article.

What should I send to a vendor or editor?

Send the exact asset version, time interval, requested action, sample timing and a short comparison of the relevant neighboring pictures. Include whether the issue occurred in stepped review, ordinary playback or both.

Read next. When the issue is the quality of movement inside a generated shot, evaluate the creative instruction alongside the delivery timing. Text-to-video production workflow. More production resources from Token360.

Editorial revision: November 4, 2026. Test dates and dated source snapshots remain as stated in the article.

  • Video Editing
  • Media Validation
  • Tutorial

Build faster with one AI API.

Use Token360 to call video, image, audio, and text models with one key and one bill.

Get started