Timecode Calculator
Convert between timecode, total frames and seconds at any of eight frame rates. Add or subtract two timecodes, or measure the duration between them. Drop-frame and non-drop-frame are both handled at 29.97 and 59.94, with the arithmetic done properly.
It runs entirely in your browser. Nothing is uploaded, nothing is stored, and there is no account.
The label reads 3.6 ms ahead of the time that has actually passed.
Changing the rate or the drop-frame setting holds whichever field you last typed in and re-derives the other two.
B lands before A — shown as the absolute gap between them.
The duration is the distance from A to B. Inclusive adds the last frame back — the length of a shot whose first frame is A and whose last frame is B.
Why 29.97 Frames per Second Exists
Nothing about 29.97 was a design goal. It is the residue of making colour television backwards-compatible with the black-and-white sets already sitting in people's living rooms.
Monochrome NTSC ran at exactly 30 frames per second — 60 fields, locked to the 60 Hz mains supply. When colour was standardised in 1953, a chrominance subcarrier had to be squeezed into the same 6 MHz channel without producing a visible beat pattern against the luminance signal, and without beating audibly against the sound carrier sitting 4.5 MHz above the picture carrier. The solution was interleaving: place the colour subcarrier at an odd multiple of half the line frequency, so its dot pattern inverts from frame to frame and averages out to grey on an old receiver. Making that work against the sound carrier as well fixed the line rate at 4.5 MHz divided by 286, which is 15,734.264 Hz. NTSC has 525 lines per frame, so the frame rate fell out as 15,734.264 ÷ 525 = 29.970029… frames per second.
That is exactly 30 × 1000/1001. Colour television slowed down by one part in a thousand, and every timecode problem in the sixty years since has been a consequence of that one part. The same 1000/1001 factor produced 23.976 (24 fps film slowed to live inside NTSC) and later 59.94. Countries on 50 Hz mains standardised on 25 fps, never needed the trick, and to this day never need drop-frame.
What Drop-Frame Actually Drops
Drop-frame timecode does not drop frames. It drops numbers.
This is the most repeated misunderstanding in post-production, and it survives because the name says the opposite of what happens. No picture is discarded. No audio is discarded. The file is not touched. What is skipped is a label: at the top of most minutes, the counter jumps from ;29 straight to ;02 without ever issuing ;00 or ;01 for that minute. Every frame that was recorded is still there, still in order, still played at exactly the same moment it would otherwise have been.
The reason is arithmetic. Timecode counts in whole labels, and a "second" of timecode at 29.97 fps is 30 labels, while a real second contains 29.97 frames. Count 30 labels a second for an hour and you have issued 108,000 labels for the 107,892 frames that actually exist — 108 labels too many, which is 3.6 seconds of lie. A programme reading exactly 01:00:00:00 of non-drop timecode is one hour, three seconds and eighteen frames long by the clock on the wall.
Drop-frame removes exactly those 108 surplus labels, and spreads the removal evenly: two labels at the start of every minute, except every tenth minute, which is left alone. Sixty minutes minus the six tenth-minutes is 54 minutes, and 54 × 2 = 108. The counter and the clock agree again.
It is still not exact. In 3,600 real seconds there are 3,600 × 30000/1001 = 107,892.108 frames, and only whole labels can be skipped. That leftover 0.108 of a frame means an hour of drop-frame timecode elapses about 3.6 milliseconds before a real hour does — and it takes roughly nine and a quarter hours for the residue to accumulate into a single frame. For a broadcast programme that is close enough to exact. For a clock left running across a multi-day shoot it is not, which is why facilities re-jam their timecode rather than trusting it to hold overnight.
The Semicolon Is Not Decoration
HH:MM:SS:FF is non-drop. HH:MM:SS;FF is drop-frame. The last separator is the entire declaration, and it is the only part of a timecode string that tells you how to read the digits in front of it.
The convention is near-universal — Avid, Premiere, DaVinci Resolve, FFmpeg's -timecode option and most broadcast hardware all follow it. Some applications write semicolons between every field (00;00;00;00), which means the same thing. Some show a small DF or NDF flag beside the number instead. What matters is that a bare timecode without its notation is incomplete information: at 29.97 fps, 01:00:00:00 and 01:00:00;00 are 108 frames apart, and nothing in the digits themselves distinguishes them.
There is exactly one free integrity check the format gives you, and it is worth knowing. A drop-frame timecode whose frames field reads ;00 or ;01 at the top of a minute that is not a multiple of ten cannot exist, because that label was never issued. So 00:07:00;01 is not a valid drop-frame timecode — it is proof that something in the chain mislabelled a non-drop number as drop-frame. This calculator refuses those labels and says which one the minute really starts on, rather than quietly converting a number that no deck ever produced.
One Hour, Measured Ten Ways
Every row below reads 01:00:00 on the counter. They are not all the same length, and they are not all the same number of frames — an hour of 23.976 and an hour of 29.97 non-drop hold 86,400 and 108,000 frames respectively, and both run three and a half seconds past the hour they claim.
| RATE | WRITTEN | FRAMES | REAL ELAPSED TIME |
|---|---|---|---|
| 23.976 | 01:00:00:00 | 86,400 | 01:00:03.600 |
| 24 | 01:00:00:00 | 86,400 | 01:00:00.000 |
| 25 | 01:00:00:00 | 90,000 | 01:00:00.000 |
| 29.97 non-drop | 01:00:00:00 | 108,000 | 01:00:03.600 |
| 29.97 drop-frame | 01:00:00;00 | 107,892 | 00:59:59.9964 |
| 30 | 01:00:00:00 | 108,000 | 01:00:00.000 |
| 50 | 01:00:00:00 | 180,000 | 01:00:00.000 |
| 59.94 non-drop | 01:00:00:00 | 216,000 | 01:00:03.600 |
| 59.94 drop-frame | 01:00:00;00 | 215,784 | 00:59:59.9964 |
| 60 | 01:00:00:00 | 216,000 | 01:00:00.000 |
The 3.6-second gap in the three 1000/1001 non-drop rows — 23.976, 29.97 and 59.94 — is the drift drop-frame was invented to cancel. The four ten-thousandths of a second left in the drop-frame rows is what it cannot. The integer rates never drift at all, which is why 25 fps countries never needed any of this.
How to Convert Frames to Timecode
- 1Pick the frame rate the material was shot atNot the rate you are delivering at — the rate the timecode is counted at. If they differ, convert at the source rate first and treat the change of rate as a separate step, because the same frame count means a different duration at a different rate.
- 2Set drop-frame or non-dropOnly 29.97 and 59.94 offer the choice. If the number you were given has a semicolon before the frames field, it is drop-frame; if it has a colon, it is not. Getting this backwards is a 108-frame error per hour, and it is silent.
- 3Type into any of the three fieldsTimecode, total frames and seconds are linked — fill in whichever one you have and the other two follow, along with the real elapsed duration. For arithmetic, use the second panel: add two timecodes, subtract one from the other, or measure the distance between them.
Everything runs locally in your browser. No file is uploaded and nothing is sent anywhere.
Why a One-Frame Error Compounds
A frame at 29.97 fps is 33.4 milliseconds. At 24 fps it is 41.7, at 60 fps it is 16.7. Individually those are nothing. The problem is that timecode errors are not random noise that averages out — they are systematic, and everything downstream inherits them.
The constant offset
Someone mistypes a head timecode, or a reel is logged one frame early. The error is one frame, and it stays one frame — but it applies to every event in the list. Conform a 300-event edit decision list against a source that is one frame out and you have 300 cuts that are each one frame out. Nothing looks broken enough to spot in a scrub, and every one of them is wrong.
The rate error
This one grows. Read a 29.97 non-drop master as drop-frame and you are 108 frames further out with every hour that passes: fine at the head, 3.6 seconds out at the tail. Cut a 25 fps list against 24 fps material and you gain a frame every second — sixty frames inside the first minute. The characteristic symptom is an edit that is perfect at the start of the reel and visibly broken at the end, which is also why it survives a spot check.
Both kinds land in the same places. Audio and picture separate until lip movement stops matching the sound. A music cut placed on the beat drifts off it. A programme built to fill an exact broadcast slot misses the slot by a few seconds, which is the kind of error that gets a delivery rejected rather than noted. And because timecode carries no checksum and almost never self-validates, the first symptom is usually the finished picture, not the moment the mistake was made.
How the Drop-Frame Arithmetic Works
Timecode to frames is positional counting against a time base — the integer number of labels in one second of timecode. The time base is 30 at 29.97 fps and 24 at 23.976, never the decimal.
Drop-frame then subtracts the labels that were never issued. Two per elapsed minute at 29.97 (four at 59.94), except every tenth minute:
The reverse direction is the awkward one, because you cannot simply divide: minutes are not all the same length. A ten-minute block holds 30 × 600 − 9 × 2 = 17,982 frames, and a short minute holds 1,798. The frame count has to be inflated back up to what it would have been had nothing been skipped, and only then split positionally. That is why a hand-rolled drop-frame converter usually works for the first minute and starts failing somewhere after the tenth.
Seconds are a third conversion, and the one most often done wrong. Use the exact fraction, not the decimal shorthand: 29.97 is 30000/1001, so 107,892 frames is 107,892 × 1001 ÷ 30,000 = 3,599.9964 seconds. Divide by the literal 29.97 instead and you get exactly 3,600 — which is wrong by 3.6 milliseconds, and 3.6 milliseconds is precisely the residue drop-frame cannot remove. This calculator stores every rate as a fraction so the number never disappears.
Checking any timecode calculator in one move
Ask it for 01:00:00;00 at 29.97 drop-frame. The answer is 107,892 frames. If it returns 108,000 it is ignoring drop-frame entirely; if it returns 107,892 but also accepts 00:01:00;00 as a valid input, its validation is decorative. Then ask it to relabel 108,000 frames as drop-frame: the answer is 01:00:03;18, and it is the same 3.6 seconds from the table above, viewed from the other side.
Where This Sits in an AI Video Editor
Timecode is a way of naming a moment to a machine that has no idea what is in the picture. It exists because the tape deck could not be told "start where he finishes the sentence".
Valmera is an agentic AI video editor, and it removes the step rather than automating it. You upload real footage — up to 14 GB or 3 hours, MP4, MOV, MKV or WebM — and the agent indexes it once into a word-level transcript, detected silences, shot boundaries and labelled frame tiles it actually looks at. Then you describe the edit in plain English. "Cut the pause before I say pricing" resolves to a real position with a real frame boundary, because the agent read the transcript; you never name a number, and neither does it guess one.
Underneath, the edit is an edit decision list in seconds rather than a rendered file, so nothing is destructive and anything cut can be restored by asking. The final export renders from your original upload at source quality rather than from the preview proxy. Captions are burned in — there is no SRT or VTT import or export — and there is no timecode field to type into anywhere in the product, which is rather the point.
Browse the rest of the toolset in the AI video editing tools hub, or read how the timeline and transcript work in the timeline & transcript docs.
Frequently Asked Questions
Stop Naming Moments by Number
Upload your footage and describe the edit. 50 free credits on every account, no card required.
Try Valmera free →