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.
Two common sync patterns have 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. Check several cues before choosing: irregular errors may need individual cue edits instead of one correction across the file.
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
Check an identifiable line near the start and another near the end. Record the subtitle timestamp and the moment each line is spoken. These measurements give an initial correction; verify a cue in the middle too, because two matching endpoints do not prove that every scene follows the same timing rule.
| Near the start | Near the end | Pattern to investigate | Correction to try |
|---|---|---|---|
| 2s out | 2s out, same direction | A constant offset, possibly from an added or removed opening. | One offset. |
| In sync | Minutes out, growing | A consistent rate difference, if intermediate cues follow the same pattern. | Stretch only. |
| 2s out | Much further out | A starting offset plus a consistent rate difference. | Stretch and offset together. |
| In sync | In sync, but wrong in the middle | Different edits or errors in individual cue times. | Inspect the affected cues; one linear rule cannot correct this pattern. |
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. Apply the correction, then check the same moments and an intermediate cue again.
Why Subtitles Drift
Playback speed and frame rate are different
A frame-rate label alone does not tell you to stretch subtitles. A video can be converted to a different frame rate by duplicating or dropping frames; changing playback timestamps is a separate operation. FFmpeg documents these separately in its fps filter and timestamp filter.
Use a frame-rate ratio only when the same sequence actually plays at a different speed between the two versions. Otherwise measure the cue times and use the two-cue solver. WebVTT defines cue timestamps relative to the media playback position, so the timing you hear and see is the relevant check. See the WebVTT timing specification.
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.
Example Corrections for a Known Speed Change
These examples assume the same frames play at different rates, with no other edits. For a subtitle timestamp of 3600 seconds, the correction is (scale − 1) × 3600 seconds. The amount alone does not identify the cause of a sync problem.
| Subs made for → your video is | Scale | Correction at original 01:00:00 |
|---|---|---|
| 25 fps → 23.976 fps | 1.042709 | about 2 min 34 s later |
| 23.976 fps → 25 fps | 0.959040 | about 2 min 27 s earlier |
| 25 fps → 24 fps | 1.041667 | 2 min 30 s later |
| 24 fps → 23.976 fps | 1.001001 | about 3.6 s later |
Verify the proposed correction against the actual recording. If the middle still drifts or a scene jumps out of sync, inspect the edit and individual cue times instead of choosing another frame-rate preset.
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 the errors are the same size and direction, try a constant offset. If the error grows at a consistent rate, try a linear stretch and verify a cue in the middle too. An irregular pattern can indicate different edits or cue-level errors that a single offset and scale cannot repair.
- 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
This utility retimes an existing subtitle file. It does not modify or re-encode video, burn captions into the picture, or transcribe audio. Those are separate jobs that require a video or caption editor.
It applies one linear rule to the whole file. If timing errors vary irregularly between scenes, compare the subtitles with the exact video edit and correct individual cues in a subtitle editor, or obtain a better-matched file. A clamp warning means some adjusted timestamps reached zero; review those opening cues.
Moving timestamps does not correct words or line breaks. Edit that text separately and check it against the audio before using the retimed file.
Burned-In Captions in Valmera Studio
A separate subtitle file can be paired with the wrong video version or given an incorrect playback offset. Burning captions into the picture avoids that separate-file handoff. It does not guarantee that the words or their original timing are correct.
Valmera is an agentic AI video editor. You upload your footage, an agent transcribes it to word-level timestamps from that exact file, and the captions are burned into the picture during the render. Review caption spelling, placement and timing in the preview, especially around cuts. Ask for corrections before exporting the final MP4 in Studio.
Valmera Studio has no SRT or VTT import or export. Use this free utility to retime an existing subtitle file. Use Studio when the deliverable is an edited video with captions visible in the picture. 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. Account creation and uploads are free; a subscription is required to edit.
Create an account →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.
Create an account →