Skip to content
VoiceDeck

DF/NDF Subtitle Timecode Converter

Convert subtitle timecodes between drop-frame and non-drop at 29.97 or 59.94 fps, with per-line validation and a drift annotation showing how far NDF has slipped from the wall clock — free, instant, in your browser.

VoiceDeck

Client review & approval for video, audio, images & PDF — one link, no per-seat fees.

Try Free

Timecodes to convert

One timecode per line — HH:MM:SS:FF (non-drop) or HH:MM:SS;FF (drop-frame). Stray lines are flagged, not fatal.

Converting at fps. Rows are relabeled to the

Results

Paste one or more timecodes to see the converted labels here.
Input Converted Drift

Wall-clock drift for

Wall clock NDF label

Drop-frame's own residual drift is far smaller than this — about 3.6 ms per hour, a footnote rather than a bar on this scale.

Not every drop-frame label exists.

At 29.97 fps, frames ;00 and ;01 don't exist in the first second of any minute that isn't a multiple of ten — the counter jumps straight from ;29 to ;02. At 59.94 fps that skip doubles to ;00;03. A DF input that names one of those non-existent labels is rejected with the rule spelled out, not just flagged as "invalid". Round-tripping any valid label through both directions always reproduces the original exactly — see the Timecode Calculator for general SMPTE timecode math, or the Subtitle 2-Frame Gap Calculator to check cue spacing once your timecodes match the master's scheme.

About DF/NDF Subtitle Timecode Converter

Why drop-frame exists (the short version)

NTSC color video doesn't run at an even 30 frames per second — it runs at 30000/1001 ≈ 29.97 fps. If you label every frame with a plain 30-per-second counter (non-drop timecode, NDF), the label falls behind real elapsed time by 0.1%: after an hour of real time, NDF timecode reads 3.6 seconds short of the wall clock. Drop-frame timecode (DF) corrects this without touching a single frame of picture — it renumbers, it doesn't delete. DF skips frame labels ;00 and ;01 at the start of every minute except each tenth minute (00, 10, 20, 30, 40, 50), removing 108 labels per hour and holding DF within about 3.6 milliseconds of the wall clock — roughly a thousand times tighter than NDF. At 59.94 fps the same 0.1% slowdown applies, but each second nominally holds 60 labels instead of 30, so the skip doubles: DF at 59.94 drops ;00, ;01, ;02 and ;03 in every non-tenth minute, 216 labels per hour.

Where this actually wrecks subtitle timing

A subtitle file (SRT, VTT, or a caption track authored inside an NLE) carries timecodes or millisecond offsets that assume one counting scheme. If that file gets conformed against a master timed with the other scheme, every cue is technically "correct" against its own numbers and subtly wrong against the picture. Because the two schemes only diverge by 0.1% of elapsed time, the error doesn't show up as an obvious jump cut — it creeps in at roughly 2 frames of drift per minute of program, so a 10-minute segment can end up nearly half a second out, and a full-length program can drift a couple of seconds by the credits. Early in the show it's invisible; by the third act, dialogue and text have visibly separated. This is exactly the kind of error that survives an in-house spot-check and gets caught (or missed) at delivery QC — the fix is knowing which scheme your source uses before you retime against a new master, not after a client flags drifting captions.

Spotting which scheme a file or master uses

The most reliable tell is the separator: drop-frame timecode is written with a semicolon before the frame field (01:00:00;00), non-drop with a colon (01:00:00:00). If a vendor delivery note, EDL, or burned-in timecode window uses semicolons, treat it as DF. Absent that, check the NLE sequence settings — Premiere, Resolve and Avid all expose a drop-frame toggle on the timeline's frame-rate setting, and it's usually set to match house delivery standard (DF for NTSC broadcast masters, NDF for web/short-form). When in doubt, convert both ways and compare the result against a known reference point in the program (a slate, a burn-in, or a black frame with printed timecode).

Worked example: converting an hour mark

Take 01:00:00:00 NDF at 29.97 fps. First, convert the label to an absolute frame position: (1×3600 + 0×60 + 0) × 30 + 0 = 108,000 frames. That position falls after 6 complete ten-minute DF blocks — 6 × 17,982 valid DF labels = 107,892 — leaving 108 labels into the 7th block. Because that block's first minute (minute 00, divisible by ten) isn't a drop minute, those 108 labels count straight through at 30 labels per second: 108 ÷ 30 = 3 seconds, remainder 18 frames. Result: 01:00:03;18 DF — the same real frame, a different label, now 3 seconds and 18 frames "ahead" in its own numbering because it has skipped 108 non-existent labels to get there.

Why SRT files mostly dodge this — until they don't

SRT and WebVTT store cue times in hours:minutes:seconds,milliseconds, not frame-accurate SMPTE timecode — there's no DF/NDF ambiguity in the file itself, because milliseconds don't drop labels. The problem only appears the moment those millisecond cues get conformed to a frame-accurate timeline: an editor pulling SRT cues into a DF-timed broadcast master, or a QC pass that converts millisecond timestamps to SMPTE timecode for a delivery spec, has to pick a scheme — and picking wrong reintroduces the same creeping drift a frame-based file would have shipped with from the start.

Frame rate NDF drift vs wall clock DF residual drift Labels skipped/hour
29.97 fps 3.6 s / hour ≈3.6 ms / hour 108 (;00, ;01)
59.94 fps 3.6 s / hour ≈3.6 ms / hour 216 (;00–;03)

NDF's drift ratio is identical at both rates because it comes purely from the 1000/1001 slowdown, independent of how many nominal labels a second holds.

How to use the DF/NDF Subtitle Timecode Converter

  1. Paste one timecode or a whole list, one per line.

  2. Declare whether the list is currently labeled DF or NDF, and choose 29.97 or 59.94 fps - invalid drop-frame labels are rejected line by line.

  3. Copy the relabeled timecodes with their drift annotations, then check cue spacing with the Subtitle 2-Frame Gap Calculator.

Frequently Asked Questions

What's the difference between drop-frame and non-drop timecode?

Non-drop timecode (NDF) labels 30 (or 60) frames every second and falls 3.6 seconds behind the wall clock every hour, because 29.97/59.94 fps video actually runs 0.1% slower than a round 30/60. Drop-frame timecode (DF) fixes the drift by skipping frame labels ;00 and ;01 (or ;00–;03 at 59.94) at the start of every minute except each tenth minute — no picture frames are deleted, only the numbers are renumbered. DF is written with a semicolon (01:00:00;00), NDF with a colon (01:00:00:00).

Why are my subtitles drifting out of sync?

Almost always a scheme mismatch: your subtitle file was authored against one counting scheme (say, NDF) and it's now laid against a master timed in the other (DF), or vice versa. The two only diverge by 0.1% of elapsed time, so the drift creeps in gradually — roughly 2 frames per minute of program — invisible early on, obvious by the third act. Convert your cue timecodes to match the master's actual scheme to fix it.

Does drop-frame delete frames?

No. Drop-frame renumbers labels, it does not delete or skip any actual video frames. "Dropping" refers only to frame numbers — labels ;00 and ;01 (or ;00–;03 at 59.94) simply don't exist in non-tenth minutes, so the counter jumps straight from ;29 to ;02. Every frame of picture is still there and still gets a label; it just isn't the label you might expect.

How do I know if a timecode is DF or NDF?

Check the separator first: a semicolon before the frames field (01:00:00;00) means drop-frame, a colon (01:00:00:00) means non-drop. If you're looking at an NLE sequence instead of a printed timecode, check the frame-rate setting on the timeline — Premiere, Resolve and Avid all expose an explicit drop-frame toggle, which should match your delivery spec (typically DF for NTSC broadcast masters, NDF for short-form or web delivery).

Why does drop-frame only exist at 29.97 and 59.94 fps?

Because drop-frame only corrects a drift that exists at NTSC-derived rates — 29.97 and 59.94 fps, both built from the 30000/1001 ratio adopted when color was added to NTSC broadcasting. True 24, 25, 30 and 60 fps don't drift against the wall clock at all, so there's nothing for drop-frame to fix; a drop-frame toggle at those rates would just introduce numbering errors for no benefit.

Do SRT files use drop-frame?

SRT and WebVTT store cue times as hours:minutes:seconds,milliseconds, not frame-accurate SMPTE timecode, so there's no DF/NDF label to get wrong inside the file itself. The ambiguity only appears when those millisecond cues get conformed onto a frame-accurate timeline — at that point you have to declare which scheme the target master uses, and picking wrong reintroduces the same drift a timecode-based file would have shipped with.

More Subtitle & Caption Tools tools

Frame-accurate client review for subtitled video — VoiceDeck

VoiceDeck adds client review & approval for video, audio, images & PDF — one shareable link, no per-seat fees, so every file ships in spec.