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.
Nothing is uploaded. The file is read and rewritten by JavaScript on this page.
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 start | Near the end | What it is | The fix |
|---|---|---|---|
| 2s out | 2s out, same direction | Constant 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 sync | Minutes out, growing | Pure rate error. The file was timed against a copy running at a different framerate. | Stretch only. |
| 2s out | Much further out | Both at once. A framerate mismatch on top of a different head. | Stretch and offset together. |
| In sync | In sync, but wrong in the middle | Not 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 is | Scale | Drift per hour |
|---|---|---|
| 25 fps → 23.976 fps | 1.042709 | subtitles run 2 min 34 s early by the hour mark |
| 23.976 fps → 25 fps | 0.959040 | 2 min 27 s late by the hour mark |
| 25 fps → 24 fps | 1.041667 | 2 min 30 s |
| 24 fps → 23.976 fps | 1.001001 | 3.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.
= (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
- 1Measure the error at the start and at the endPlay 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.
- 2Decide whether it is an offset or a stretchIf 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.
- 3Load the SRT or VTT into the toolDrop 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.
- 4Apply the correctionFor 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.
- 5Check the before-and-after, then downloadThe 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 →Frequently Asked Questions
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 →