Frame-accurate subtitles at any frame rate

Subtitle files store time in milliseconds. Editing timelines think in frames. Converting between the two badly is why captions that looked fine at the start of a video are visibly wrong by the end. This is what actually has to happen, and what to set.

Start transcribing, free

A millisecond cannot name a frame

At 23.976 fps a frame lasts 1001/24000 of a second (41.708333… ms). No frame boundary after the first lands on a whole millisecond, so an SRT timecode is always slightly off the frame it means. That error alone is harmless. What is not harmless is what a tool does with it.

Round each time independently and errors scatter. Convert at the wrong rate and the error is proportional to elapsed time, which is the drift people actually notice: fine in the first minute, a second out by minute ten.

The rates, and why the odd ones exist

What frame-accurate export requires

Every time has to be an integer frame index, and the arithmetic has to stay in integers. Here each caption's start is floored to a frame and its end is ceiled, so a caption is on screen for every frame in which its words are audible, with a minimum of one frame and no overlap between neighbours.

FCPXML writes each time as an exact rational (1001/24000 s), so it is a frame multiple by construction rather than by rounding. Premiere marker XML writes integer frame counts, which is already what the frame model produces. SRT, WebVTT and SubViewer are converted from those same frames, so all five formats land on identical frames rather than each rounding separately.

Which rate to pick

The frame rate of the sequence you are importing into, which is not necessarily the source video's. A 29.97 clip dropped on a 23.976 timeline is conformed by the editor; your captions are not, unless you tell them.

Drop frame versus non-drop frame changes how the timecode ruler is labelled and never changes which frame a caption lands on. Exports here are always non-drop for that reason. If your timecode display disagrees with your captions' position, this is not the cause.

Detecting the rate automatically

For MP4 and MOV files the rate is read straight out of the container's metadata, which gives the exact rational rather than a decimal that could be 23.976 or 24. Nothing is decoded, so it works for ProRes, a codec browsers cannot play and exactly what a Final Cut user exports. For WebM or a damaged file it falls back to timing decoded frames. Either way it only preselects the picker, and you should confirm it against your sequence.

Frequently asked questions

Which frame rates are supported?

23.976, 24, 25, 29.97, 30, 50, 59.94 and 60, written in the rational form Final Cut itself uses so NTSC rates stay exact.

What if I pick the wrong one?

Captions land progressively further from where they should. Between 23.976 and 24 that is about one frame every 33 seconds. Re-export at the correct rate and re-import; nothing is permanently wrong with the transcript.

Does SRT support frames?

No, and it cannot: SRT has millisecond resolution and no concept of a frame rate. The frame rate still matters because the cues are computed from frames before being written as milliseconds, so they agree with the FCPXML and marker exports.

Should I use drop frame?

It makes no difference to caption position. Drop frame only changes how timecode is labelled so that it tracks wall-clock time at NTSC rates. No frames are dropped and no caption moves.

Ready to try it?

Try it free without an account. Sign in to download your file, plus 15 minutes and 5 transcriptions a month.

Open the subtitle generator

Need more than that? See pricing : one-time packs from $5, and nothing expires.