Skip to main content

Free Subtitle Shifter / Resync

Fix out-of-sync subtitles — shift all timings earlier or later and correct frame-rate mismatches. Keeps the original format. Runs in your browser.

Works offline once loaded

Drop a subtitle file (or paste below)

SRT, VTT, SBV, LRC, ASS, SSA, TXT · processed on your device

or press Ctrl+V to paste from your clipboard

Browse files
0s

Positive delays the subtitles (use if they appear too early); negative advances them (if they lag the audio).

💡 Fixes subtitles that are out of sync — shift everything earlier or later, and correct frame-rate mismatches with the speed factor. The format is detected and preserved. Everything runs in your browser.

Common uses

  • Fix Subtitles That Appear Too EarlyDelay subtitles so they line up with later audio.
  • Fix Subtitles That Lag the AudioAdvance subtitles that appear after the dialogue.
  • Fix Frame-Rate Subtitle DriftCorrect subtitles that slowly drift out of sync over time.
  • Resync Subtitles for a Different CutShift subtitles to match a version with a different intro length.
  • Resync SRT, VTT, or ASS SubtitlesShift timing in whatever subtitle format you have.

How It Works

When subtitles run ahead of or behind the audio, you just need to shift their timing. This re-times every cue in your browser, keeping the file format intact.

  1. 1
    You paste or drop a subtitle file
    SRT, VTT, SBV, LRC, or ASS — the format is detected automatically. Nothing is uploaded.
  2. 2
    You set a time shift
    Enter seconds (positive to delay, negative to advance) or use the quick presets. A speed factor also corrects frame-rate mismatches (e.g. 23.976↔25 fps).
  3. 3
    Every cue is re-timed
    Each cue's start and end are adjusted by the offset (and factor), clamped so nothing goes negative.
  4. 4
    You download the synced file
    The result is written back in the same format, ready to use.

Subtitles can contain unreleased dialogue. The re-timing runs entirely on your device — your captions are never uploaded.

Guide

Worked example

Press "Try a sample". The box fills with four cues and the label reads "Subtitle text — SRT (SubRip), 4 cues". Say the lines appear 2.5 seconds too early: press "+1s" twice and "+0.5s" once, and the badge beside "Time shift" reads +2.5s. "Preview (before ⇒ after)" shows "First cue (#1)" moving from 0:00:01.0 → 0:00:03.2 to 0:00:03.5 → 0:00:05.7, and "Last cue ends at 0:00:11.5 ⇒ 0:00:14.0". "⬇ Download SRT" saves sample_shifted.srt, whose first timing line is 00:00:03,500 --> 00:00:05,700. For drift, type 2 under "First cue should start at" and 10.8 under "Last cue should start at", then press "Apply sync": "Speed factor" shows ×1.1 and "Time shift" shows +0.9s.

Which settings to use, and the limits

  • Check which way to shift. A positive "Time shift" delays the subtitles, for lines that appear too early; a negative one brings them forward, for lines that lag the audio. Type a value, or press the preset buttons, which add to the current value: -10s, -5s, -1s, -0.5s, -0.25s, -0.1s, +0.1s, +0.25s, +0.5s, +1s, +5s and +10s. Switch "Unit" to milliseconds for "+100 ms" style buttons and a box that steps by 10 ms; in seconds it steps by 0.1. "reset" sets the shift to zero, and an emptied box counts as zero.
  • Use Two-point sync when the error grows over time. The "Two-point sync" panel appears once the file has two or more cues. Type when the first and last cue should start, for example 2 and 10.8, or 0:00:02.0 and 1:32:10.200: seconds, minutes and seconds, or hours too, with an optional fraction of up to 3 digits, and a comma or a dot both work. The last time must be later than the first. "Apply sync" then sets both "Time shift" and "Speed factor", replacing what was there. Until the times are valid you see "Enter valid times like 1:23:45.500, with the last cue after the first."
  • Use the speed factor for frame-rate mismatches. Every time becomes the old time multiplied by the factor, and then the shift is added. The buttons are "None (1×)", "23.976→25" (about ×1.04271), "25→23.976" (about ×0.95904), "25→24" (×0.96) and "24→25" (about ×1.04167). If one makes the drift worse, try the opposite one. The factor in use shows beside the label with up to five digits. For a drift that matches none of these, Two-point sync works out the factor for you.
  • Keep the format, or convert on the way out. The format is detected from the text: SRT, WebVTT, SBV, LRC or ASS/SSA. "Output format:" starts at "Same as input". For SRT, WebVTT and ASS written in the same format, only the timestamps are rewritten, so styles, NOTE and STYLE blocks, cue ids and cue settings survive. Any other choice, including SBV, LRC and "Plain text", rebuilds the file from the parsed cues. That keeps the text and basic italic, bold and underline tags where the new format has them, but other styling and positioning can be lost.
  • Check the encoding if letters look wrong. "File encoding (reading)" starts on "Auto-detect". That tries, in order, a byte order mark, UTF-16 and valid UTF-8. If none fit, it falls back to the legacy code page usual for the page's language, which on this English page is Windows-1252; it does not work out GBK, Big5, Shift_JIS or EUC-KR from the bytes. The line "Not UTF-8, so it was read as windows-1252" tells you it was a guess. Choose the right entry (UTF-8, UTF-16, Windows-1250 to 1258, Windows-874, KOI8, Shift_JIS, GBK, Big5, EUC-KR) and the original file is decoded again.
  • Choose the download encoding and name. "Download encoding" starts on "Same as input file": UTF-8 stays UTF-8, with or without its byte order mark; UTF-16 BE is written as UTF-16 LE; single-byte code pages stay as they were; GBK, Big5, Shift_JIS and EUC-KR cannot be written, so they come out as UTF-8 with BOM. You can force UTF-8, UTF-8 with BOM, UTF-16 LE, Windows-1250 to 1258, Windows-874 or KOI8. "Windows line endings (CRLF)" and "Keep the original file name" are optional; otherwise the name is the original plus _shifted.

Common problems and how to fix them

It says "No subtitle cues found."
The tool looked for timing lines with text and found none. It guesses the format from the content, and anything it does not recognise is tried as SRT. SRT and WebVTT cues need a line like 00:01:02,500 --> 00:01:04,000 followed by at least one line of text; a cue with a time but no text is skipped. ASS needs "Dialogue:" lines, SBV needs two comma-separated times, and LRC needs [mm:ss.xx] tags. Open the file in a text editor to see what it really contains.
It says "Could not read that file. Try dropping it again."
The browser could not read the bytes of the file, or turning them into text failed. A common cause is a file that moved or changed after you picked it, or one that is still syncing from a cloud folder. Pick it again from its current place. As a workaround, open the file in a text editor and paste its text into the box, which skips file reading.
It says "Not UTF-8, so it was read as windows-1252, the usual legacy encoding for this language. If the text looks garbled, pick the right file encoding above."
The file was not valid UTF-8, so the tool guessed a legacy code page from the page's language, and on the English page that is Windows-1252. For a Chinese, Japanese, Korean, Greek, Hebrew or Cyrillic file, open "File encoding (reading)" and try GBK, Big5, Shift_JIS, EUC-KR, Windows-1253, Windows-1255 or Windows-1251 until the text looks right. Then check "Download encoding".
It says "2 cues were shifted before 00:00 and clamped to zero — reduce the negative shift to avoid losing timing."
A subtitle cannot start before 0:00. With a negative shift, any cue whose start would fall below zero is set to zero, and its end is clamped too, so a cue can shrink to nothing or several cues can pile up at the start. The number is how many cues were affected. Lower the negative shift, or delete the first lines in the box before shifting, as the tip under the message says.
It says "3 characters cannot be stored in windows-1252 and will download as “?”. Choose UTF-8 to keep them."
A single-byte Windows or KOI8 code page holds only 128 characters beyond plain ASCII. When the text has letters outside the chosen page, such as Chinese characters while "Download encoding" is Windows-1252, each one is replaced by a question mark in the downloaded file, and the message counts them. Set "Download encoding" to UTF-8 to keep every character. The text in the box does not change, only the saved bytes.

How it compares

Subtitle Shifter changes timing only: one offset, a speed factor, or both worked out from two reference times. It reads SRT, WebVTT, SBV, LRC and ASS/SSA, can save in those formats or as plain text, and for SRT, WebVTT and ASS written in the same format it leaves styling and notes untouched. It has no video player, so you cannot see the subtitles against the picture here; judge the result from the first and last cue times and check it in your own player. It does not find the right offset for you and has no waveform sync. You can edit the text in the box before saving, but there is no per-cue timing editor. The page says everything runs in your browser.

Related Tools

Frequently Asked Questions