← Home
FREE TOOL

Published · Updated

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.

FRAME RATE
Two frame labels skipped at the top of every minute except every tenth. 29.97 fps is really 30000/1001 fps.
CONVERT
REAL DURATION00:59:59.996
TIMECODE01:00:00;00

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.

ADD, SUBTRACT, MEASURE
DURATION00:07:29;15
FRAMES13471
REAL DURATION00:07:29.482
INCLUSIVE00:07:29;16 · 13472 frames

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.

RATEWRITTENFRAMESREAL ELAPSED TIME
23.97601:00:00:0086,40001:00:03.600
2401:00:00:0086,40001:00:00.000
2501:00:00:0090,00001:00:00.000
29.97 non-drop01:00:00:00108,00001:00:03.600
29.97 drop-frame01:00:00;00107,89200:59:59.9964
3001:00:00:00108,00001:00:00.000
5001:00:00:00180,00001:00:00.000
59.94 non-drop01:00:00:00216,00001:00:03.600
59.94 drop-frame01:00:00;00215,78400:59:59.9964
6001:00:00:00216,00001: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

  1. 1
    Pick the frame rate the material was shot at
    Not 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.
  2. 2
    Set drop-frame or non-drop
    Only 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.
  3. 3
    Type into any of the three fields
    Timecode, 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.

frames = ((hours × 60 + minutes) × 60 + seconds) × base + frameField

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:

totalMinutes = hours × 60 + minutes skipped = dropped × (totalMinutes − ⌊totalMinutes ÷ 10⌋) frames = positionalCount − skipped 01:00:00;00 at 29.97 → 108,000 − 2 × (60 − 6) = 107,892

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

A timecode calculator converts between the three ways a position in a video can be written: SMPTE timecode (HH:MM:SS:FF), a total frame count, and elapsed seconds. It also adds and subtracts timecodes and measures the distance between two of them. The conversions depend entirely on the frame rate, and at 29.97 and 59.94 fps they depend on whether the timecode is drop-frame or non-drop-frame, which is why every field on this page is tied to a rate selector and a drop-frame switch.
Divide the frame count by the time base — the integer number of frame labels per second, which is 30 at 29.97 fps and 24 at 23.976 — then split the result into hours, minutes and seconds, with the remainder as the frames field. At 30 fps, frame 90,000 is 00:50:00:00. Drop-frame is not a straight division, because most minutes are two labels shorter than the rest; the frame count has to be inflated back to what it would have been without the dropped labels before it can be split.
No. Drop-frame timecode drops numbers, not pictures. Nothing is removed from the video, the audio or the file. What is skipped is a label: at the top of most minutes the counter jumps from ;29 straight to ;02, so the labels ;00 and ;01 are never issued for that minute. Every frame that was recorded is still present and still plays. The name is the source of the confusion — it describes what happens to the counter, not to the footage.
Because 108 labels were skipped along the way. One hour at a time base of 30 would be 108,000 labels. Drop-frame skips two labels at the start of every minute except every tenth minute — 54 such minutes in an hour, so 54 × 2 = 108 skipped — leaving 108,000 − 108 = 107,892. That figure is also, not coincidentally, the number of frames a 29.97 fps camera actually records in an hour, which is the whole point of the scheme.
The semicolon before the frames field means drop-frame. HH:MM:SS;FF is drop-frame, HH:MM:SS:FF is non-drop. Some applications write semicolons between every field instead, and some show a small DF or NDF flag beside the number, but the meaning is the same. The notation is not decoration: at 29.97 fps, 01:00:00:00 and 01:00:00;00 are 108 frames apart, and nothing in the digits themselves tells you which one you are holding.
It is a side effect of adding colour to NTSC television in 1953 without breaking the black-and-white sets already in use. The colour subcarrier had to be interleaved so it would not beat visibly against the picture or audibly against the sound carrier 4.5 MHz away. The frequency that satisfied both constraints gives a line rate of 4.5 MHz ÷ 286 = 15,734.264 Hz, and at 525 lines per frame that is 29.970029… frames per second — exactly 1000/1001 of 30. The same factor produced 23.976 and 59.94. PAL countries at 25 fps never needed it, and never needed drop-frame either.
Follow the delivery spec first — if one exists, it says which. Where it does not: drop-frame exists so that timecode duration matches clock duration, which matters when a programme has to fill a broadcast slot measured in real minutes, so 29.97 and 59.94 broadcast deliverables are usually drop-frame. Non-drop is the norm for 23.976 and 24 fps material, partly because a stable count is easier to reason about in post and VFX, and partly because drop-frame is not defined at those rates at all.
No. Drop-frame is defined only for the NTSC 30-family rates — 29.97 and 59.94 — where two and four labels respectively are skipped per minute. There is no standard drop-frame at 23.976, 24, 25, 30, 50 or 60, so this calculator disables the switch at those rates rather than inventing a scheme for them. At 23.976 the clock still drifts by the same 3.6 seconds an hour; the convention is to live with the drift rather than correct it.
Convert to a total frame count first, then divide by the exact frame rate — not the decimal shorthand. 29.97 is really 30000/1001, so 107,892 frames is 107,892 × 1001 ÷ 30,000 = 3,599.9964 seconds. Dividing by the literal 29.97 returns exactly 3,600 and hides a 3.6 millisecond error, which happens to be the very residue drop-frame cannot remove. This calculator keeps every rate as a fraction for that reason.
Not as something you type. Valmera is an agentic AI video editor: you upload footage and describe the edit in plain English, and the agent works from a word-level transcript, detected silences, shot boundaries and frames it looks at, so a request like "cut the pause before I say pricing" resolves to a real position without anyone naming one. Internally the edit is a decision list in seconds, and the final export is rendered from your original file at source quality.

Stop Naming Moments by Number

Upload your footage and describe the edit. 50 free credits on every account, no card required.

Try Valmera free →
See pricing →

Related Articles

What Is an Edit Decision List?
The list of in and out points a conform is rebuilt from — and where a one-frame error does the most damage.
Subtitle Timing Shifter
Shift or rate-convert subtitle timings in the browser — the same 1000/1001 problem, downstream.
Video Bitrate Calculator
Trade bitrate, duration and file size against each other before you export.
Docs: Timeline & Transcript
How Valmera represents an edit, and what you point at instead of typing a timecode.
All AI Video Editing Tools
Every editing job Valmera can do, one page each.