- Published:
- Updated:
- Reviewer:
- Jonathan
Fix Subtitle Timing: Offset, Drift and Different Cuts
If the same subtitle is early or late by roughly the same amount throughout the video, shift the subtitle times by that amount. A growing difference needs drift diagnosis and a measured transformation. If it changes suddenly at an edit, first check that the subtitles and video are the same cut.
This guide explains how to measure subtitle timing, apply the correction and check the saved SRT.
Start with the video and subtitle you actually have
Keep the original SRT unchanged and work on a copy. Open the video, load its external subtitle file and select the subtitle track you intend to check. If text never appears, first confirm the file loaded, the track is enabled and playback reaches a cue; a timing offset is not yet established.
An SRT stores text and start/end times, not the video. The Library of Congress description documents that separation. You need the corresponding media as well as the subtitle file.
Measure the same line at three points
Choose a recognizable spoken line near the beginning, middle and end. Record its existing SRT start time, then the time that line is spoken in the video. Do not compare different dialogue lines or translate a guessed sound into a match.
Define the file correction as video time − current subtitle time. These original example values are not a tool or product test:
| Position | Current SRT start | Matching video speech | File correction |
|---|---|---|---|
| Beginning | 00:00:12,000 | 00:00:10,000 | −2 seconds |
| Middle | 00:10:02,000 | 00:10:00,000 | −2 seconds |
| End | 00:20:02,000 | 00:20:00,000 | −2 seconds |
A similar difference at all three points suggests a constant shift. An increasing difference suggests possible uniform drift; a sudden jump suggests a local edit or unmatched cut. Three measurements are a useful check, not proof of the cause.
Correct a constant file offset
Apply the correction to both start and end times of every affected cue. For the example above, subtract 2 seconds. A cue becomes:
1
00:00:10,000 --> 00:00:12,000
The train leaves soon.Its original interval was 00:00:12,000 --> 00:00:14,000. Conversely, text at 8 seconds for speech at 10 seconds needs +2 seconds. Preserve cue text, ordering and positive durations. If any shifted time would be negative, inspect that early cue and your match; do not silently wrap it to another hour or discard text. Edit that boundary explicitly before saving.
SubtitleTools documents a millisecond-based whole-file shift and its constant-offset limit: 2 seconds is 2000 milliseconds. Review a tool’s handling of your content before supplying files; private subtitles need a suitable local option.
Use playback adjustment for a temporary correction
For viewing only, a player’s subtitle-delay setting can move text without rewriting the original SRT. A player adjustment is not a corrected deliverable. Avoid applying the same correction both in the file and the player.
VLC’s desktop 3.0 documentation describes synchronization controls. Labels and shortcuts depend on interface and version; the ranked tool page and official documentation give conflicting shortcut descriptions. Use a known line to test a small adjustment, observe whether text moves earlier or later, then adjust accordingly. Determine the player-control direction with that check before using the file formula.
Handle uniform drift with two anchors and a third check
If you have two unambiguous matches and the mismatch grows smoothly, a linear mapping can be considered. Let s1, s2 be the current subtitle times and v1, v2 their matching video times, all in seconds:
a = (v2 − v1) / (s2 − s1)
b = v1 − a × s1
corrected time = a × old time + bOriginal example: s1=10, v1=10, s2=610, v2=616 gives a=1.01, b=−0.1; an old time of 310 maps to 313 seconds. Apply the mapping to starts and ends, then round to milliseconds. Two equal subtitle anchors cannot define a scale; reversed or nonmatching anchors invalidate the measurement.
Check an independent line in the middle before accepting the transformation. If it fails, or the mismatch jumps after missing scenes or inserted material, use subtitles for the matching cut or realign affected segments. Confirm the cause independently before attributing drift to a frame rate. SubShifter describes a linear-correction option.
Realign separate segments after a timing jump
Prefer subtitles for the matching cut if available. Otherwise, find the last correctly matched line before the jump and the first clearly matched line after it. Separate cues into ranges by their actual dialogue, keeping a list of original cue numbers. Measure a matching line in each range, apply that range’s correction to both start and end, then check another line inside the same range. Repeat after every further jump; do not apply the later correction to already aligned earlier cues.
An original example has a 0-second correction before the boundary and a −5-second correction after it:
| Range | Original cue | Matching video interval | Treatment |
|---|---|---|---|
| Before | 00:04:55,000 —> 00:04:57,000 | 00:04:55,000 —> 00:04:57,000 | Keep both times |
| Crossing boundary | 00:04:59,000 —> 00:05:02,000 | 00:04:59,000 —> 00:05:01,000 | Measure both ends manually |
| After | 00:05:10,000 —> 00:05:12,000 | 00:05:05,000 —> 00:05:07,000 | Subtract 5 seconds from both |
The middle row assumes the entire written phrase is still spoken in the target video. Applying 0 to its start and −5 to its end would produce 299 → 297 seconds, an invalid duration. Instead, use the separately observed 299 → 301 seconds. If words have been removed from the target cut, do not display them as if spoken: record the difference and explicitly edit or remove that cue in the working copy, retaining the original. If the correspondence is unclear, stop that segment rather than invent timings.
A corrected example copy for those three matched phrases is:
1
00:04:55,000 --> 00:04:57,000
The train is here.
2
00:04:59,000 --> 00:05:01,000
Wait for me.
3
00:05:05,000 --> 00:05:07,000
We can board now.An independent before-boundary line at 260 seconds should still match at 260; an after-boundary line at 600 should match at 595. Check the boundary phrase separately. These invented measurements illustrate validation, not a repaired real video or proof of what caused the jump.
Handle a correction that would produce negative time
If an original 1 → 3-second cue needs −2 seconds, the calculated interval is −1 → 1. First recheck the matching dialogue and correction. If the actual phrase in the target video is independently observed from 0 → 1 second, manually set this cue to 0 → 1, preserve its text and record that its duration changed. Do not clamp all negative cues automatically. If the phrase is absent, or its endpoint cannot be identified, keep the original and leave that cue unresolved instead of silently dropping words or wrapping the time. This is a hypothetical boundary example, not an observed playback result.
For a documented editor route, Subtitle Edit 5’s shift instructions support selected lines as well as all lines; select only the confirmed range. Its point-sync instructions describe setting reference lines to video positions. Use File → Open and File → Save as to work on a separate SRT copy. Check the interpolation against an independent middle line and both endpoints.
Apply the measured correction in an editor
The official control screenshot shows range selectors and execution buttons. Set the range before executing:
- Open the SRT working copy through File → Open, then Synchronization → Adjust all times….
- Set the time amount to two seconds (00:00:02,000). Choose Adjust all only for a confirmed whole-file offset. For a bounded segment, select its confirmed cues and choose Adjust selected lines. Adjust selected lines and forward also affects every following cue, so reserve it for a remainder with the same measured correction.
- After confirming that range and amount, click Show earlier once for−2 seconds, or Show later once for+2 seconds. These execute an adjustment; inspect the resulting times before any further operation.
- Check that12–14 becomes10–12 in the−2 example, with words preserved. Inspect a selected and an unaffected cue. If direction or range is wrong, reopen the intact copy and remeasure. After checking, use File → Save as… for a new SRT.
For measured anchors, Synchronization → Point sync… offers line selection and Set sync point: load the matching video, position it at the matched speech, record the point, repeat for the next confirmed line and apply with OK. Check an independent third line and both endpoints afterwards. Use the third line and endpoints to check the interpolation against your measured anchors.
Save, reload and verify the actual deliverable
Save a new .srt copy, keeping numeric cue identifiers, HH:MM:SS,mmm --> HH:MM:SS,mmm timing lines, text and blank separators. Reopen the saved file, reset temporary player delay and explicitly load the corrected copy rather than a cached original.
Check the beginning, middle and end for the intended words, ordered times, positive cue duration and readable characters. If the wrong file loads, compare the filename and selected track. If characters are garbled, verify the actual text encoding on a copy before resaving. A successful preview at one line does not prove the final file is correct.
Choose the correction for your task
Use a constant shift for an equal offset, a measured linear mapping for uniform drift, and separate ranges for edit-related jumps. Save a new SRT and check its beginning, middle and end with the matching video.