← Home
FREE TOOL

Published · Updated

Shift Subtitle Timing

Retime an SRT or VTT file in your browser. Apply a constant offset, or a linear stretch that corrects framerate drift. Nothing is uploaded.

Out-of-sync subtitles come in two kinds and they need two different fixes. If the subtitles are wrong by the same amount all the way through, you need an offset — one number added to every timestamp. If they start close and get steadily worse, you need a stretch — every timestamp multiplied by a factor. Telling those two apart before you touch anything is the whole job; the arithmetic afterwards is trivial, and the tool below does it.

1 · Your subtitle file

Nothing is uploaded. The file is read and rewritten by JavaScript on this page.

2 · The correction

Negative moves the subtitles earlier; use it when they appear after the words are spoken. Positive moves them later. Seconds (-2.4), milliseconds (750ms) and timecodes (00:00:02,500) are all accepted.

Enter how far to move the subtitles. A negative number moves them earlier.

Diagnose It First: Check the Start and the End

This is the single most useful thing on this page, and almost nobody does it. Before adjusting anything, play your video and check subtitle sync in two places: somewhere in the first minute, and somewhere in the last five minutes. Write down how far off it is in each. Two measurements tell you which repair you need; one measurement tells you nothing, and is why people spend an evening nudging an offset that was never going to work.

Near the startNear the endWhat it isThe fix
2s out2s out, same directionConstant offset. The file was timed against a copy with a different head — a trimmed intro, a distributor logo, a missing ad break.One offset.
In syncMinutes out, growingPure rate error. The file was timed against a copy running at a different framerate.Stretch only.
2s outMuch further outBoth at once. A framerate mismatch on top of a different head.Stretch and offset together.
In syncIn sync, but wrong in the middleNot a timing problem. The file belongs to a different cut of the video.No linear fix exists.

The direction matters as much as the size. If a line appears before it is spoken, its timestamps are too small and the offset is positive. If a line appears after it is spoken, the offset is negative. Getting this backwards is the most common mistake, and it is easy to catch: apply the correction, then check the same two moments again.

Why Subtitles Drift

The PAL speedup — 23.976 against 25

Film runs at 24 frames per second. For PAL broadcast in Europe it was played at 25 frames per second instead — the same frames, run faster. The picture is unchanged, but the whole programme finishes exactly 4% sooner and every voice sits about three-quarters of a semitone higher unless someone corrected the pitch. Digital copies inherit both lineages: one release is 25 fps, another is 23.976 fps, and a subtitle file authored against one is wrong against the other by a factor that compounds every second.

The 23.976 figure is its own piece of history. When colour was added to NTSC, the subcarrier beat visibly against the sound carrier, and the fix was to shift the subcarrier — and with it the line and frame rates — down by exactly 1000/1001. So 30 became 29.97, and the film rate carried in digital video became 23.976. That 0.1% mismatch is small enough to pass unnoticed at the start of a film and large enough to be plainly wrong by the end — about 7 seconds across a two-hour feature.

A different cut of the same title

Theatrical, extended, broadcast and streaming versions of the same film have different runtimes for reasons that are not linear: a restored scene here, a trimmed one there. A subtitle file from one cut may be perfectly in sync for forty minutes and then jump. This is the case retiming cannot rescue, and it is worth ruling out before you start.

A different head

The most benign cause. Your copy starts with a distributor card the subtitler's copy did not have, or yours has had a cold open trimmed. The offset is constant and usually small — a few seconds — and one number fixes the whole file.

A fourth cause shows up in edited footage rather than downloaded films: subtitles written against one version of an edit, then applied after cuts moved everything. That produces errors that step at each cut rather than drifting smoothly, and no offset or stretch describes it either. If you are editing your own video, generate the captions after the cuts are final — see text-based video editing for why the order matters.

How Much Drift Means Which Framerate

If you know roughly how far the subtitles have slipped after an hour, you can usually name the framerate pair without measuring anything precisely. The drift rate is (scale − 1) × 3600 seconds per hour:

Subs made for → your video isScaleDrift per hour
25 fps → 23.976 fps1.042709subtitles run 2 min 34 s early by the hour mark
23.976 fps → 25 fps0.9590402 min 27 s late by the hour mark
25 fps → 24 fps1.0416672 min 30 s
24 fps → 23.976 fps1.0010013.6 s — small, but visible in a long film

So a file that is roughly two and a half minutes out after an hour is a PAL conversion, and one that is a few seconds out after an hour is the NTSC pulldown. The two are far enough apart that you cannot mistake one for the other.

How to Compute the Stretch Factor by Hand

Every correction here is the same straight line: new = old × scale + offset. A straight line is fixed by two points, so take two measurements — one near the start, one near the end — of a cue's time in the file (call it t) and the time that line is actually spoken in your video (call it T). Put both in seconds.

Suppose the first line of dialogue sits at 00:00:12.000 in the file but is spoken at 00:00:10.500, and a line near the end sits at 01:40:00.000 but is spoken at 01:44:12.800. In seconds that is t₁ = 12, T₁ = 10.5, t₂ = 6000, T₂ = 6252.8.

scale  = (T₂ − T₁) ÷ (t₂ − t₁)
      = (6252.8 − 10.5) ÷ (6000 − 12)
      = 6242.3 ÷ 5988 = 1.042468

offset = T₁ − scale × t₁
      = 10.5 − 1.042468 × 12
      = 10.5 − 12.5096 = −2.010 s

So this file needs stretching by about 4.2% and pulling two seconds earlier: a PAL-rate subtitle set applied to a film-rate copy that also has a couple of seconds of extra head. Check any cue by hand — a cue at 00:30:00.000 (1800 s) becomes 1800 × 1.042468 − 2.010 = 1874.432 s, which is about 00:31:14.4. The tool carries the unrounded scale and offset rather than the six-figure versions printed here, so its output can differ from a hand check by a millisecond or two.

Prefer the exact ratio when the measurement lands near one

The measured 1.042468 is close to 25 ÷ 23.976 = 1.042709, but the difference of 0.000241 is not nothing: over 6000 seconds it is 1.44 seconds of residual drift. Which number should you use? Work out the error in the measurement. If each of your two readings is good to about a quarter of a second, the uncertainty in the scale is roughly √2 × 0.25 ÷ 5988 ≈ 0.00006 — and 0.000241 is four times that. So either one of the readings is worse than you thought, or the drift is not a clean PAL case.

In practice, when a measured ratio falls within about a thousandth of a known framerate pair, use the exact pair and let the offset absorb the rest. The nominal ratio is exact by definition; your two stopwatch readings are not. That is why the tool above shows you the scale it derived — so you can compare it against the presets and decide.

How to Resync a Subtitle File

  1. 1
    Measure the error at the start and at the end
    Play the video and find a line you can identify in the first minute. Note the time it is actually spoken and the time written in the subtitle file. Do the same for a line near the end. Two measurements, four numbers.
  2. 2
    Decide whether it is an offset or a stretch
    If both errors are the same size and direction, it is a constant offset and one number fixes it. If the error at the end is larger, the file has a framerate mismatch and needs multiplying, not adding. If the errors have no pattern, the file belongs to a different cut and no retiming will help.
  3. 3
    Load the SRT or VTT into the tool
    Drop the file onto the panel above or paste its contents in. Nothing is uploaded — the file is read and rewritten in your browser. The tool reports how many cues it found and which format it detected.
  4. 4
    Apply the correction
    For a constant error, enter the offset in seconds — negative moves subtitles earlier, positive moves them later. For drift, pick the framerate pair or enter a ratio, and add an offset if the file also has a different head. Or use the two-cue solver: give the correct times of an early and a late cue and it computes both numbers for you.
  5. 5
    Check the before-and-after, then download
    The preview shows the first three cues and the last one — the last cue is where a stretch proves itself. If any timestamps were clamped to zero, the tool says so. Copy the result or download it as a new file, then play the video and re-check the same two moments you measured.

A constant offset takes under a minute. A stretch takes as long as it takes to find two lines you can identify at opposite ends of the video — which is the real work.

What This Tool Will Not Do

It retimes the subtitle file. It does not touch your video, does not re-encode anything, and does not burn subtitles into a picture — all three of those require uploading a video somewhere, and this page uploads nothing.

It also applies exactly one linear rule to the whole file, which is the correct model for framerate drift and for a shifted head, and the wrong model for everything else. Files where sync wanders back and forth, files whose framerate changes partway through, and files written for a different edit all need a different subtitle file rather than a different number. And a clamp warning on the first few cues is usually a signal that you are forcing a fit that is not there.

Finally, it does not fix the transcription. If the words are wrong or the line breaks fall badly, moving the timestamps will not help — the file needs regenerating from the audio.

Captions That Cannot Drift

Every cause on this page has the same shape: the subtitle file and the video came from different places. Drift is only possible when timings are written against one copy and played against another.

Valmera is an agentic AI video editor, and it closes that gap by not having a sidecar at all. You upload your own footage, an agent transcribes it to word-level timestamps from that exact file, and the captions are burned into the picture during the render. There is no separate file to lose, mismatch, or hand to a player that guesses. When you cut the video afterwards, the captions move with the edit, because they were never a separate timeline.

The honest trade is stated plainly: Valmera has no SRT or VTT import or export. If your deliverable is a sidecar file, this free tool is the right thing on this page and Valmera is not. If your deliverable is a finished video, burned-in captions remove the entire class of problem — they render identically on every platform, with no setup and nothing for a viewer to enable. See the auto subtitle generator, karaoke captions, or the captions documentation for what the styling actually covers.

One more thing worth knowing if you edit as well as watch: changing playback speed is the same arithmetic as framerate drift. When you speed a range up or slow it down in Valmera, the captions, music and effects are re-timed against the new program rather than left behind — which is the same reason a stretch works here.

Stop Fixing Subtitle Files

Upload footage, describe the edit, get captions timed against the exact file they are burned onto. 50 free credits, no card.

Try Valmera free →
See pricing →

Frequently Asked Questions

Load the SRT or VTT into the tool above and enter an offset in seconds. A negative number moves every cue earlier, a positive number moves every cue later. The tool rewrites every timestamp in the file and gives you the result to copy or download. If the subtitles are wrong by a different amount at the end of the video than at the start, an offset alone will not fix it — you need the stretch, which is the second mode.
If the subtitles appear before the words are spoken, their timestamps are too small, so you need a positive offset to push them later. Measure it: pause on a line you can identify, note the time it is actually spoken, and subtract the time written in the file. If the line is spoken at 00:01:14.400 and the file says 00:01:12.000, the file is 2.4 seconds early and the offset is +2.4. Subtitles lagging behind the audio need the same measurement with the opposite sign.
That is progressive drift, and it almost always means the subtitle file was timed against a copy of the video running at a different framerate. The error grows in proportion to elapsed time, so the first minute looks fine and the last reel is minutes out. No single offset can fix it, because there is no single error — you need a multiplication, not an addition. Use the framerate stretch or the two-cue solver above.
The rule is scale = the framerate the subtitles were made for, divided by the framerate of your video. Subtitles authored against a 25 fps PAL copy, applied to a 23.976 fps copy, need 25 ÷ 23.976 = 1.042709. The reverse — 23.976 fps subtitles on a 25 fps copy — needs 23.976 ÷ 25 = 0.959040. For the NTSC pulldown, 24 ÷ 23.976 = 1.001001, and its reverse is 0.999000. All six are preset buttons in the tool.
No. The file is read with the browser's own FileReader and rewritten by JavaScript on the page. There is no network request, no server, no account and no storage — you can load the page, disconnect from the internet, and the tool still works. That is also why it retimes the subtitle file rather than the video: the video would have to be uploaded somewhere to be re-encoded, and this page never uploads anything.
Yes. It detects the format from the file, and preserves the separator each timestamp used — a comma for SubRip, a dot for WebVTT — because strict players reject the wrong one. WebVTT cue settings such as line:90% align:middle, NOTE blocks, STYLE blocks and cue identifiers all pass through untouched, as do the original line endings. Only the timestamps on lines containing an arrow are changed.
They are clamped to 00:00:00,000 and the tool tells you how many were clamped. A negative timestamp is not valid in either format, and players either reject the file or mis-handle the cue. If cues are being clamped it means your negative offset is larger than the space available at the head of the file — the opening lines have nowhere left to move — which usually means the offset is wrong, or those first cues belong to content your copy of the video does not have.
No, and this is worth recognising early rather than after an hour of adjusting. Retiming applies one linear rule across the whole file. If the errors are scene-dependent with no consistent pattern, the file was written against a different cut of the video — a different regional release, a version with a scene restored, or a broadcast copy with material removed. There is no scale and offset that maps one cut onto the other. Find a subtitle file made for your exact release instead.
No. Valmera is an agentic AI video editor, not a subtitle utility — it generates captions from the audio of your own upload and burns them into the video, and there is no SRT or VTT import or export. That is a real limitation if you need a sidecar file, and this tool exists precisely because Valmera does not do that job. It is also why captions produced by Valmera cannot drift: they are timed against the same file they are rendered onto.

An Agent That Edits the Video, Not the Sidecar

Describe the edit in plain English. Cuts, captions, music and colour — then export at source quality from your original file.

Start free →
See pricing →

Related Articles

Auto Subtitle Generator
Generate subtitles from your own audio, timed against the file they are burned onto.
Add Captions to Video
Word-accurate captions: 11 presets, 12 fonts, per-word emphasis.
Docs: Captions
Presets, fonts, animations, and the editable transcript that re-renders them.
All AI Video Editing Tools
Every editing job Valmera can do, one page each.