SubShiftly

Fixing subtitle sync: offset, drift and FPS

9 min readUpdated August 2026
A camera operator filming over open water, seen from behind the viewfinder
fixing-subtitle-sync-drift-and-fps

Out-of-sync subtitles feel like one problem, but they are two, and the fix for one does nothing for the other. Before you touch anything, spend thirty seconds finding out which one you have: play a line near the beginning of the film and note how far off it is, then do the same near the end. If the two errors are the same, you have an offset. If the error at the end is much larger, you have drift — and drift usually has a frame rate behind it.

Two kinds of wrong

A constant offset means every cue is late or early by the same number of milliseconds. It comes from a release that starts differently: a distributor logo the subtitler did not have, a few seconds of black, or a broadcast version with a recap at the front. The whole file simply needs to move.

Drift means the error grows as the film goes on: half a second at the start, four seconds after an hour, a minute and a half at the credits. The subtitles are not merely displaced, they are running at the wrong speed, and no single offset can fix that. What they need is a stretch — a multiplication of every timecode — with an offset applied on top.

There is a third, rarer case worth naming: the file matches a different cut. The first half lines up, then a scene is missing and everything after it is off by a fixed amount. That is two offsets, not one, which is why a good editor lets you shift only the cues after a chosen point.

Measuring and applying a constant offset

Find a line of dialogue with a clear attack — a door slam, a name, the first word after silence — and note the time on the player when it is actually spoken. Subtract the cue's start time from it. If the spoken line happens at 00:01:12,400 and the cue says 00:01:10,000, your subtitles are 2.4 seconds early and need a positive shift of 2.400.

Sign conventions trip people up, so use the picture rather than the arithmetic: if the text appears before the actor speaks, the subtitles are early and the offset is positive. If the text arrives after the line is already finished, they are late and the offset is negative. Applying a shift never changes how long each cue stays on screen — every start and end moves together.

Check the result at a second point far from the first. If the same offset works at both, you are finished. If the second point is still wrong in the same direction and by a different amount, you have drift on top of the offset, and the next section is for you.

Drift and the two-anchor fix

Drift is linear, which is the piece of good news in all of this. Every timecode in the file is the true time multiplied by some constant and then displaced by another. Two points are enough to recover both constants — exactly like drawing a straight line through two dots.

In practice: pick a cue in the first minute or two and find the real time of that line in the video, then do the same for a cue in the last few minutes. Give the editor both pairs and it computes the scale factor and the offset, then rewrites every cue in between. The further apart the two anchors are, the more accurate the result, so resist the temptation to use two lines from the same scene.

A sanity check afterwards: the stretch factor should be very close to 1. Values like 1.0427, 1.0417 or 0.999 mean a frame-rate mismatch, which is the topic of the next section. A factor of 1.3 means one of your anchors was wrong.

The FPS trap: 23.976, 24, 25 and 29.97

Film runs at 24 frames per second. PAL television runs at 25. For decades the cheapest way to show a film on PAL was to run it 4.17 % faster — the entire picture and sound sped up, a 100-minute film finishing in 96 minutes. Subtitles authored against that PAL transfer are useless on a copy at film speed, and vice versa, because the running times genuinely differ.

Digital video added a second wrinkle. NTSC equipment runs at 30000/1001 frames per second — 29.97 — and film on NTSC media at 24000/1001, which everyone writes as 23.976. That is 0.1 % slower than 24, worth 3.6 seconds an hour: not much, but enough to be visibly wrong by the end of a feature.

The conversion itself is a ratio. Going from a file timed for 25 fps to a video at 23.976 multiplies every timecode by 25 / 23.976 = 1.042708, so an hour of film accrues about two and a half minutes of difference. Going from 24 to 23.976 multiplies by 1.001001. Applying the correct ratio fixes the drift exactly; you may still need a small offset afterwards for the different start.

When the file belongs to a different cut

Extended editions, television versions and regional releases differ by whole scenes, not by a constant. Here the file is correct in stretches and wrong between them, and the honest fix is to work section by section: find where the mismatch appears, shift everything after that point, then look for the next jump.

Two-disc releases are the other common case. Each disc has its own subtitle file starting at zero, and joining them means adding the running time of the first disc to every cue of the second. That is exactly what a merge with an offset does, and getting the offset right is easier if you take the first disc's last cue end time and add the few seconds of credits that were cut between the parts.

Checking the repair

Never trust a single spot check. Look at three places — a few minutes in, somewhere in the middle, and a few minutes before the end — and confirm the subtitle appears just as the line starts. If all three are right, the whole file is right, because there is no mechanism that would make the middle wrong while the ends are correct.

A subtitle should appear at or a few frames before the first word and disappear at or shortly after the last. If it now appears on time but flashes past, the problem was never sync — it is reading speed, and that is a different repair. Watching the file over the real video, with the cues drawn live rather than baked in, is the only check that actually settles the question.

The takeaway

Measure the error at the start and at the end before you change anything. Equal errors mean one offset; a growing error means a stretch, and the stretch factor will usually turn out to be a frame-rate ratio such as 25 / 23.976. Fix the stretch first and the offset second, then verify at three points spread across the film.

Related tool
SubShiftly subtitle editor

Open a subtitle file and fix the timing