Shift Subtitle Timing (Fix Out-of-Sync Subtitles)

Move every subtitle cue earlier or later by a fixed number of seconds, and correct framerate drift with a stretch ratio. Format in equals format out.

🌐 Español

Drop your files here (.srt, .vtt)

πŸ”’ Private by design: your files are processed locally in your browser and never uploaded to any server.

Two different problems that look the same

Subtitles that do not match the picture fail in one of two ways, and telling them apart takes ten seconds and saves a great deal of frustration.

A constant offset means the subtitles are wrong by the same amount everywhere. Two seconds early at the opening line, two seconds early at the closing one. This is what you get when a file was timed against a version with a different length of opening credits, and a single shift fixes the whole thing.

Drift means the error grows. Nearly right at the start, a second out after twenty minutes, five seconds out by the end. This is a framerate mismatch, the classic case being subtitles made for a 25 frames per second broadcast played against a 23.976 film transfer, and no amount of shifting will fix it because the two timelines are running at different speeds.

Check the first line and a line near the end. If the error is the same, shift. If it grows, stretch.

Fixing an out-of-sync file

  1. Drop your subtitle files on the box or use Choose files. SRT and VTT are accepted, several at a time.
  2. Set Shift by (seconds, negative shifts earlier, positive shifts later). If a line appears two seconds late, enter minus two.
  3. Leave the stretch ratio at 1 unless you have diagnosed drift. Otherwise set it to the ratio of the two framerates.
  4. Click Shift Subtitle Timing (Fix Out-of-Sync Subtitles).
  5. Download each result, named after its source with a shifted suffix inserted before the extension.
  6. Load it against the video and check both the opening and a late scene, not just the opening.
  7. Process another clears the queue.

Fractions are fine in both fields. Sync errors are rarely whole seconds, and 1.4 is often closer than either 1 or 2.

Scale then translate, in that order

When both corrections are in play, the stretch is applied first and the shift second. Every new timestamp is the old one multiplied by the ratio, then offset by the fixed amount.

That order is not arbitrary. Stretching first corrects the rate at which the subtitle clock runs, fixing the drift across the whole file. The offset then slides the whole corrected timeline to line up with your chosen sync point.

Do it the other way round and the shift would itself be multiplied by the ratio, so asking to move things two seconds later would move them by 2.09 seconds under a typical framerate ratio. That is not what shift by two seconds means to anybody, so the arithmetic follows the intuition rather than the other way around.

This is a single ratio applied uniformly. It cannot correct a file whose drift changes partway through, which happens when a subtitle track was assembled from two sources.

The negative shift edge case

Shifting earlier eventually runs into the beginning of the file. A cue that starts at one second, shifted three seconds earlier, would begin at minus two.

Rather than dropping the cue or clipping it, both its start and end move forward by the same amount, so it starts at zero and keeps its original duration exactly. The subtitle appears immediately at the start of playback and stays on screen for as long as it was meant to.

Only cues near the very beginning are affected, and only when the negative shift exceeds their start time. Everything after that point is shifted normally. There is also a defensive check ensuring an end time can never end up before its own start.

Everything else is left alone

This does not parse and rebuild the file. It walks through it line by line, rewrites only the lines that look like cue timings, and passes everything else through unchanged.

The practical consequence is that nothing you did not ask about is touched. A WebVTT header stays. Note and style blocks stay. Cue identifiers, whether they are sequential numbers or names, stay exactly as they were, so a file with deliberately unusual numbering is not silently renumbered. Positioning and alignment settings written after the arrow on a timing line are carried across intact.

If no timing line is found anywhere in the file, the run stops rather than handing you an unchanged copy, since that means the file was not the subtitle format its extension claimed.

The rest of the subtitle set

To change format rather than timing, SRT to VTT converts between the two. To pull an existing track out of a video file, Extract Subtitles does that, and Subtitle Editor lets you fix individual cues by hand when a uniform correction is not enough.

Once the timings are right, Add Subtitles to Video burns or attaches them. If you trimmed the video after the subtitles were made, Trim Video tells you how much you removed, which is exactly the offset to enter here. The rest is on the video tools hub.

See it in action

Screenshot of the Shift Subtitle Timing (Fix Out-of-Sync Subtitles) tool with sysfenix-subtitles.srt (216 B) loaded, Shift by (seconds, negative shifts earlier, positive shifts later) set to 0, Stretch ratio for framerate correction (1 = no change) set to 1
Shift Subtitle Timing (Fix Out-of-Sync Subtitles) mid-process: sysfenix-subtitles.srt (216 B) loaded, Shift by (seconds, negative shifts earlier, positive shifts later) set to 0, Stretch ratio for framerate correction (1 = no change) set to 1.
Screenshot of the Shift Subtitle Timing (Fix Out-of-Sync Subtitles) result screen showing sysfenix-subtitles-shifted.srt ready to download (216 B)
The finished result: sysfenix-subtitles-shifted.srt ready to download (216 B). The download link is a local blob URL β€” the file never leaves your device.

Frequently asked questions

How do I know whether I need a shift or a stretch?

Check the sync at the start and again near the end. If the subtitles are wrong by the same amount in both places, it is a constant offset and the shift field alone fixes it. If they are close at the start and drift further out as the film goes on, the timings were made for a different framerate and you need the stretch ratio, usually with a small shift as well.

What ratio do I use for a framerate mismatch?

The ratio of the two framerates, as the framerate the subtitles were made for divided by the framerate of your video. Subtitles timed for a 25 frames per second broadcast played against a 23.976 release need roughly 1.0427. Going the other way needs roughly 0.959. Getting the direction wrong doubles the drift instead of removing it, so test on a short section first.

In what order are the two corrections applied?

The stretch first, then the shift. That order is what makes the two controls mean what you expect. Stretching first corrects drift across the whole file, and the offset then nudges everything by the same fixed amount to line up your chosen sync point. Applying the shift first would scale the shift itself by the ratio, so asking for two seconds would move things by something other than two seconds.

What happens if a negative shift pushes a cue before the start?

The cue is moved forward to time zero and its end time moves by the same amount, so the cue keeps its original duration. Nothing is dropped and nothing is truncated, because a cue simply cannot begin earlier than the beginning of the file. Only the cues near the very start are affected, and only when the negative shift is larger than their start time.

Does anything other than the timing lines change?

No. This is a surgical line by line rewrite that only touches lines matching a cue timing pattern. The header of a WebVTT file, any note or style blocks, cue identifiers and numbers, positioning settings on the timing line, and every word of dialogue all pass through untouched. Cue numbering is not rebuilt, so a file with unusual numbering keeps it.

Can I convert between SRT and VTT while shifting?

No, and that is deliberate. The format is decided by the file extension and the output always matches the input, so an SRT stays an SRT and a VTT stays a VTT. The only format-dependent behaviour is which separator is written between the seconds and the milliseconds, since the two formats disagree on that one character.

What are the limits on the two fields?

The shift is held to an hour in either direction, and the stretch ratio between 0.5 and 2. Both limits are enforced inside the tool rather than only by the input boxes. A ratio of zero or a negative one falls back to 1, which is the no-change value, rather than producing nonsense timings.

Can I fix several files at once?

Yes, drop as many as you like and each produces its own download with a shifted suffix added before the extension. The same offset and ratio are applied to all of them, which is right for a series where every episode came from the same mistimed source and wrong if each file needs its own correction.

Related tools