SubtitleLens

Fix Out-of-Sync Subtitles: Constant Offset vs Frame-Rate Drift

Subtitles out of sync? Diagnose constant offset vs frame-rate drift in seconds, then apply the right fix (shift or re-time) with concrete fps numbers.


Diagnose first, fix second

When subtitles are off, there are exactly two root causes. Pick the wrong fix and you waste time or make it worse.

Constant offset: every subtitle is off by roughly the same amount: 2 seconds early at minute 5, 2 seconds early at minute 45. The gap is stable throughout the video.

Frame-rate drift: subtitles start close to correct and gradually slide further out of sync. At minute 10 they’re 1 second late; at minute 40 they’re 4 seconds late; by the end of a 90-minute film they might be 4–5 minutes out. The gap grows with time.

Watch five minutes near the start, then skip to the middle, then near the end. Measure the offset each time. If the number stays roughly constant: offset problem. If it keeps growing (or shrinking): frame-rate problem.


Fixing a constant offset

A constant offset usually means the subtitle file was timed for a different cut of the video (an intro was removed, or someone added a 3-second studio card), or it was ripped from a disc with a different chapter structure. The audio and video are fine; the SRT timestamps just need a flat shift.

Use our subtitle shifter to move all timestamps forward or backward by the amount you measured. Enter a negative value to shift earlier, positive to shift later. The math is applied to every cue simultaneously, so one adjustment fixes the whole file.

A few practical tips:


What frame-rate drift actually is

SRT files store timestamps as HH:MM:SS,mmm. They have no native concept of frame rate. The problem arises because subtitle files are usually authored against a specific video encode, and when that encode is transcoded or distributed at a different frame rate, the timestamps no longer match the frames.

The three frame rates that cause the most trouble:

Frame rateWhere it comes from
23.976 fpsNTSC-origin film; most US streaming encodes
25 fpsPAL video; European broadcast standard
29.97 fpsNTSC video; US broadcast, older DVD encodes

The drift is easy to calculate. If your SRT was timed for 25 fps but the video runs at 23.976 fps:

scale factor = 23.976 / 25 = 0.95904
drift per minute = 60 × (1 − 0.95904) ≈ 2.46 s / min

After 60 minutes of video, subtitles are about 2.5 minutes out of sync. After a 90-minute feature they’re closer to 3.75 minutes off. That’s the characteristic signature of a 25↔23.976 mismatch: subtitles that start almost right and become unwatchable by the second act.

The 29.97↔23.976 mismatch is even more severe:

scale factor = 23.976 / 29.97 = 0.80000  (both are exactly 24000/1001 and 30000/1001)
drift per minute = 60 × (1 − 0.8) = 12 s / min

Twelve seconds per minute is so fast you’ll notice within the first scene. This usually happens when someone grabs an SRT intended for a film encode and plays it against a broadcast or DVD rip of the same title.

The 25↔29.97 pairing is less common but follows the same logic:

scale factor = 25 / 29.97 = 0.83417
drift per minute ≈ 9.95 s / min

Fixing frame-rate drift: re-timing

A flat shift cannot fix drift. You need to multiply every timestamp by a correction factor. This is called re-timing or speed-correcting the subtitle file.

The formula:

corrected_timestamp = original_timestamp × (actual_fps / subtitle_fps)

You need to know both values, or guess them correctly. The actual fps of the video file is usually visible in VLC (Tools → Media Information → Video) or any media inspector. The fps the SRT was authored for is harder to know if the file didn’t come with documentation; the common guesses in order of likelihood are 23.976, 25, and 29.97.

If you don’t know which fps the SRT was authored for, try each of the three common values and see which correction makes the drift disappear. There’s no automated way to detect it from the SRT alone, because SRT timestamps are wall-clock time, not frame counts.

Some subtitle editors (Subtitle Edit is the most common open-source option) have a “Change frame rate” dialog that does this multiplication for you. You input the original fps and the target fps, and it rewrites every timestamp in the file. Spot-check a few cues near the end of the runtime afterward, since that’s where any residual error is largest.

For batch processing or scripting, the same multiplication can be applied programmatically. Every timestamp in an SRT follows a fixed pattern, so a script can parse, multiply, and rewrite in a few lines of code.


Edge case: both problems at once

Occasionally you’ll see both: a file that starts 2 seconds early and drifts. This happens when a subtitle was authored for a different fps and a different cut. Fix the drift first (re-time with the correct scale factor), then apply a flat offset to handle the remaining constant gap. Doing it in the other order is harder because the drift makes it difficult to measure the true offset.


When the subtitles are in a foreign language and wrong timing

If you’re working with a subtitle file in another language that came out of a translation service and has timing problems, the source is often that the translator took an SRT from one encode and delivered it assuming you have the same encode. Our free SRT translator preserves timestamps exactly, so the right order is: fix the timing on the original-language file first, then translate.

Format conversion (SRT ↔ VTT) never causes drift by itself: the two formats represent time identically. If a conversion appears to break timing, the converter mangled the parsing; our SRT ⇄ VTT converter converts timestamps 1:1.

If you need a full subtitle file re-done with correct timing, Happy Scribe generates SRT from the audio directly, which sidesteps the fps mismatch entirely since the output is timed to the actual audio, not derived from a pre-existing file.


Summary

SymptomCauseFix
Constant gap throughout the videoWrong cut, missing intro, chapter offsetFlat shift via subtitle shifter
Growing/shrinking gapFrame-rate mismatch (23.976/25/29.97)Re-time: multiply all timestamps by actual_fps / subtitle_fps
BothDifferent fps and different cutRe-time first, then shift

Measure the offset at the start, middle, and end before touching anything. Two minutes of diagnosis saves an hour of trial and error.

Disclosure: the Happy Scribe link above is an affiliate link. If you subscribe through it we earn a commission at no extra cost to you. It doesn’t change our recommendations.