Back to blog

How to Fix Subtitles Out of Sync With Video (Step by Step)

SubtitlesEditingCaptions

Your subtitles show up a beat before the line is spoken, or they slide further and further behind until the last caption lands a full sentence late. Both problems look identical for the first minute of playback, but they have different causes and different fixes. This guide walks through how to fix subtitles out of sync with video manually, using free tools, and when the timing is beyond repair, how to rebuild the timestamps from the audio itself.

Before you touch anything, you need to know which of the two failure modes you have. Getting this wrong is why so many people apply a delay, watch the first thirty seconds, declare victory, and then find the file broken again at minute ten.

Step 1: Diagnose whether it is a constant offset or a progressive drift

Open the video with the subtitle file loaded in a player that shows timecodes, such as VLC or MPV. Then do a two point check.

  1. Play the very first line of dialogue. Note how far off the subtitle is, in seconds. Say it appears 2 seconds early.
  2. Skip to roughly the last few minutes of the video. Play a line of dialogue there and note the gap again.

If the gap is the same at both points, for example 2 seconds early at the start and 2 seconds early at the end, you have a constant offset. Every timecode in the file needs to move by the same amount. This is the easy fix and it is covered in Step 2.

If the gap grows, for example half a second early at the start and 15 seconds early at the end, you have drift. The subtitle file was timed against a version of the video that runs at a different speed, almost always a frame rate mismatch. Skip ahead to Step 4.

A third possibility: the gap is inconsistent, sometimes ahead, sometimes behind, with no pattern. That usually means the subtitle file belongs to a different cut of the video entirely, with scenes added or removed. No global adjustment will fix that. Go to Step 5.

Step 2: Fix a constant offset in your video player first

If you only need to watch the video once, do not edit the file at all. Every serious player has a live subtitle delay control.

In VLC:

  • Press H to push subtitles later (they appear further into the video).
  • Press G to push subtitles earlier.
  • Each press moves the track by 50 milliseconds by default. Hold the key or tap repeatedly until the words land on the mouth movements.
  • The current offset appears on screen as you adjust, for example "Subtitle delay 1200 ms". Write that number down; you will need it in Step 3 if you want to save the fix permanently.
  • To change the step size, go to Tools, then Preferences, then Show settings: All, then Input / Codecs, and adjust the subtitle track synchronisation value.

In MPV:

  • Press Z to delay subtitles and X to advance them, in 0.1 second steps.
  • The on screen message shows the total offset.

In IINA on macOS: open the Quick Settings panel, choose the Subtitles tab, and drag the Delay slider.

This adjustment lives only in your player session. Close the file and it is gone. That is fine for one viewing, but useless if you are shipping the subtitles to YouTube, a client, or a course platform.

Step 3: Shift every timecode in the SRT permanently

To bake the offset into the file, you shift all timecodes by the same amount. Pick one of these three methods.

Method A: Subtitle Edit (Windows, free)

  1. Open Subtitle Edit and load your SRT.
  2. Go to Synchronization, then Adjust all times (show earlier/later).
  3. Enter the offset you measured, in hours, minutes, seconds, milliseconds.
  4. Choose "Show later" if the subtitles are appearing too early, or "Show earlier" if they are lagging behind the speech.
  5. Click Apply, then File, then Save.

Method B: Aegisub (Windows, macOS, Linux, free)

  1. Load the video and the subtitle file.
  2. Go to Timing, then Shift Times.
  3. Enter the offset, choose forward or backward, and set the scope to "All rows".
  4. Apply, then save the file.

Method C: FFmpeg on the command line

FFmpeg can shift a subtitle file in one command. To push subtitles 2.5 seconds later:

ffmpeg -itsoffset 2.5 -i input.srt -c copy output.srt

To pull them 2.5 seconds earlier, use a negative value:

ffmpeg -itsoffset -2.5 -i input.srt -c copy output.srt

Always write to a new filename. If you overwrite the original and the offset was slightly wrong, you have lost your reference point.

Method D: Edit the file by hand

An SRT is plain text. Open it in any text editor and you will see blocks like this:

14
00:01:23,400 --> 00:01:26,120
So that is the first thing to check.

For a handful of lines you can retype the timecodes yourself. For a 45 minute video with 600 cues, do not attempt this. Use one of the tools above.

Step 4: Fix a frame rate mismatch causing subtitle drift

Progressive drift is nearly always a frame rate problem. The classic case is a subtitle file timed for 23.976 fps film being played against a 25 fps PAL version of the same content, or the reverse.

The relationship is a simple ratio. A 25 fps version runs faster than the 23.976 fps version by a factor of roughly 1.0427. Over a 90 minute film, that is several minutes of accumulated error, which is why drift becomes unmissable by the end.

To correct it:

In Subtitle Edit:

  1. Go to Synchronization, then Change frame rate.
  2. Set "From frame rate" to the frame rate the subtitles were timed at.
  3. Set "To frame rate" to the frame rate of your video file.
  4. Apply and save.

Finding your video's actual frame rate: in VLC, go to Tools, then Codec Information, and read the Frame rate field. On the command line, ffprobe yourvideo.mp4 prints the frame rate in the stream details.

The common pairs you will encounter are 23.976 and 24, 25 and 24, and 29.97 and 30. If you do not know the source frame rate of the subtitles, try 23.976 to 25 first, since that is by far the most common mismatch in circulation.

When you do not know either frame rate, use point synchronisation instead. In Subtitle Edit, open Synchronization, then Point sync. Pick a line near the start and a line near the end, tell the tool the correct timestamp for each, and it stretches everything in between proportionally. Aegisub offers the same thing through Timing, then Timing Post-Processor, and through its audio waveform view.

Step 5: Regenerate the timestamps from the audio when nothing lines up

If the offset is inconsistent, if the subtitle file came from a different edit of the video, or if you have already spent twenty minutes nudging values without getting it right, stop adjusting and start over.

The reliable fix is to generate a fresh subtitle file directly from your video's own audio track. Speech recognition timestamps every word against the waveform of the exact file you have, so there is no frame rate assumption, no offset, and no mismatch with a different cut. Any change you made to the video, a trimmed intro, an inserted sponsor read, a removed section, is already accounted for because the transcript is derived from that version and no other.

This is also usually faster than repairing a broken file. Upload the video or paste a link into a transcription tool such as Tapescribe, and you get an SRT or VTT timed to your file, which you can drop straight into your editor or upload to your platform. If you are starting a project from scratch rather than repairing one, our guide on how to add subtitles to video automatically covers the full workflow.

One practical note: if you have already corrected the English subtitles and now need other languages, regenerate or translate from the corrected file, never from the broken one. Otherwise you propagate the same timing fault into every language you produce. Our guide on translating video subtitles into multiple languages covers keeping timings intact across versions.

Step 6: Verify the fix at three points, not one

Before you call it done, check the corrected file at the start, the middle, and the end of the video. Most bad subtitle fixes pass a check at the opening line and fail everywhere else, because a constant shift was applied to a drift problem.

If the start and end both look right but the middle is off, you are dealing with a cut difference rather than a timing difference, and you need Step 5.

Common problems and how to fix them

Subtitles are correct at the start but drift later. This is a frame rate mismatch, not an offset. Applying a delay makes the start wrong without fixing the end. Go to Step 4.

The fix works in VLC but breaks on YouTube or a course platform. You probably adjusted the delay in the player rather than editing the file. Player offsets are not saved into the SRT. Redo the correction using Step 3.

Subtitles are hardcoded into the picture and cannot be shifted. Burned in captions are pixels, not text, and cannot be retimed. You would need to source or generate a fresh subtitle track and re-export. If you are choosing between burned in and separate subtitle files for a project, our guide on how to burn subtitles into a video explains the tradeoff.

Timing is right but lines appear and vanish too fast to read. That is a duration problem, not a sync problem. In Subtitle Edit, use Tools, then Fix common errors, and enable the minimum duration rule. In Aegisub, use the Timing Post-Processor to enforce minimum durations and add lead in and lead out padding.

The file plays fine locally but uploads with no timing at all. Check the file encoding. Save as UTF-8 without a byte order mark, and confirm the extension matches the actual format. An SRT renamed to .vtt will fail on platforms that parse strictly.

Two subtitle blocks overlap on screen. After a shift, adjacent cues can collide. Subtitle Edit flags overlapping timecodes under Tools, then Fix common errors.

Frequently Asked Questions

Why do my subtitles slowly get more out of sync as the video plays?

That is drift, and it means the subtitle file was timed against a version of the video running at a different frame rate. The most common cause is a file timed for 23.976 fps being played against a 25 fps copy, or the reverse. A fixed delay will not solve it because the error grows over time. You need a frame rate conversion or a point sync, covered in Step 4.

How do I permanently fix subtitle timing rather than adjusting it every time I watch?

Player controls such as VLC's H and G keys only change playback for that session. To make the fix permanent, edit the timecodes in the SRT itself using Subtitle Edit, Aegisub, or an FFmpeg offset command. Save to a new filename so you keep the original as a reference point.

Can I fix subtitles that are out of sync on YouTube?

Yes. Download or open the caption file in YouTube Studio under Subtitles, correct the timing offline using the steps above, then delete the old track and upload the corrected file. YouTube's built-in editor lets you nudge individual cues, which is workable for a few lines but slow for a whole video.

Is it better to fix a broken subtitle file or generate a new one?

If the error is a clean constant offset, fixing it takes under a minute and you should just do it. If the timing drifts, the cues do not match your edit, or you have already tried several adjustments without success, generating fresh subtitles from your video's audio is faster and more reliable, because the timestamps are derived from the exact file you have.

The practical takeaway

Almost every out of sync subtitle problem comes down to one question asked at the start: is the gap the same at the end of the video as it was at the beginning? A constant gap means shift every timecode by one value and you are done. A growing gap means a frame rate mismatch, and the fix is a ratio conversion or a two point sync, not a delay. And when the subtitles simply belong to a different version of the video, stop repairing and regenerate the timestamps from the audio you actually have. Check your work at three points before you ship, and you will not have to do it twice.