Subtitle Timing Shifter
Move every cue by the same amount, or fit a drifting file between two points you know are right — then check whether what comes out is actually readable. SRT, WebVTT and ASS in, the same format back out, and the file never leaves your machine.
Shift or stretch: which one you need
Almost every out-of-sync subtitle file is one of two problems, and they have different fixes. Reaching for the wrong one is why people download the same subtitles four times and conclude that none of them match.
Constant offset → shift
The first line is 2 seconds late and the last line is 2 seconds late. The error never grows.
Usually a different release: an extra distributor logo, a recap trimmed from the front, a broadcast intro the web version does not have. Every cue is wrong by the same amount because everything before them was moved by the same amount.
Fix: one number. Shift the whole file and the spacing between cues is untouched.
Growing error → anchor fit
The first line lands perfectly and the last line is 8 seconds out. Somewhere in the middle it was 4.
The file was authored against a different frame rate or a differently conformed master, so the timings run at a slightly wrong speed. The error is proportional to elapsed time, so no single offset can remove it — correcting the start makes the end worse.
Fix: two numbers. Give one cue near the start and one near the end their correct times, and everything between and beyond is fitted linearly.
The tool prints the fit it applied — a scale and an offset — and then says in plain language how far the end of your file moved, computed from that fit rather than from a rule of thumb. If the scale comes back as exactly 1, the file only ever needed a shift, and the tool says that too.
Working in frames instead of seconds
An editor watching a timeline does not think "the subtitles are 0.125 seconds early". They think "three frames early", because three frames is what they can see and what they can nudge. So this tool accepts a shift in frames — and then insists on knowing the frame rate, because a frame is not a fixed length of time.
seconds = frames ÷ fps
| Rate | One frame | Ten frames | Exact rate |
|---|---|---|---|
| 23.976 fps | 41.71 ms | 417.1 ms | 24000 ÷ 1001 |
| 24 fps | 41.67 ms | 416.7 ms | 24 exactly |
| 25 fps | 40.00 ms | 400.0 ms | 25 exactly |
| 29.97 fps | 33.37 ms | 333.7 ms | 30000 ÷ 1001 |
| 30 fps | 33.33 ms | 333.3 ms | 30 exactly |
The gap between 23.976 and 24 looks like rounding and is not: over a feature it is the difference between locked and visibly late. Ten frames at 23.976 is 417.1 ms and at 24 it is 416.7 ms, which is why the tool carries the exact rate rather than the label. The full set of rates it offers is 23.976, 24, 25, 29.97, 30, 50, 59.94, 60 — the frame calculator covers the same arithmetic without a subtitle file attached, and the timecode converter handles drop-frame counting.
One caution: shifting by frames is not the same as converting between frame rates. A shift moves everything by one fixed amount whatever the rate; a rate conversion multiplies. If your file drifts steadily and you know both rates, that is a conversion, not a shift.
How fast is too fast
Correct timing is not the same as readable timing. A cue can be perfectly in sync with the dialogue and still be unreadable, because the words go by faster than anyone can take them in. The checks below run against whatever is currently in the tool, and every number is editable.
| Rule | Broadcast / streaming | Relaxed / social | Counted in |
|---|---|---|---|
| Reading speed | 20 | 25 | characters / second |
| Minimum duration | 0.833 | 0.5 | seconds |
| Minimum gap | 0.083 | 0.04 | seconds |
| Line length | 42 | 32 | characters |
| Lines per cue | 2 | 2 | lines |
- Reading speed. How fast the text goes by. Above roughly 20 characters a second an adult reader stops finishing lines before they cut, and the caption becomes decoration.
- Minimum duration. Even one word needs long enough to register. The broadcast figure is five sixths of a second — 0.833 — which is where that odd number comes from.
- Minimum gap. Two captions with no gap between them look like one that flickered. Two frames at 24 fps is 0.083 s, and that is the origin of the broadcast value.
- Line length. A line wider than about 42 characters forces the eye off the picture and back, which costs more than the extra words are worth.
- Lines per cue. Three lines cover too much of the frame and are read as a block rather than as speech. Two is the near-universal ceiling.
Two of those numbers look arbitrary and are not. The 0.833-second minimum duration is five sixths of a second, an interval that predates digital subtitling. The 0.083-second minimum gap is two frames at 24 fps — 83 milliseconds — and it exists so that two consecutive captions read as two captions rather than as one that flickered.
Characters per second is counted on the visible text only: markup is stripped first, so <i> does not read as four characters of dialogue, and counting is by code point, so an emoji counts once rather than twice.
Broadcast / streaming: Netflix Timed Text Style Guide (English) — general requirements. Checked August 2026.
Relaxed / social: A VidoSick house preset, not a published standard — short-form captions are read differently and no broadcaster publishes numbers for them.
Checked August 2026. Every repair is a checkbox: the tool reports what it found and applies only what you tick, because a converter that silently "fixes" a professional's file is worse than one that tells them what is wrong.
Frequently asked questions
How do I fix subtitles that are out of sync?
If every line is late or early by the same amount, shift the whole file by that amount — load it here, type the offset in seconds or frames, and download. If the file starts in sync and slips further out as it goes, a shift cannot fix it: use anchor fit instead, giving the correct time for one cue near the start and one near the end.
What is the difference between shifting and stretching?
A shift adds the same number of seconds to every cue, so the gap between the first and last line never changes. A stretch multiplies the times, so the error at the end can be different from the error at the start. Constant offset means shift; growing error means stretch, which this tool does through two anchor points rather than by asking you to work out a ratio.
How many seconds is one frame?
One divided by the frame rate: 41.71 ms at 23.976 fps, 41.67 ms at 24 fps, 40.00 ms at 25 fps, 33.37 ms at 29.97 fps and 33.33 ms at 30 fps. That is why a shift denominated in frames needs a frame rate to mean anything, and why this tool asks for one instead of assuming 24.
Why did my subtitles drift by exactly one second per hour?
Because the file was authored against a slightly different frame rate, not because the timing was typed wrong. That is a frame-rate problem rather than a timing problem, and the fix is a ratio rather than an offset. Anchor fit will remove it, and the frame-rate converter is the more direct route when you know both rates.
Can a shift push cues before the start of the video?
Yes, and this tool says so instead of silently deleting them. A negative shift large enough to move the first cue past zero raises a warning naming how many cues are affected, and clamping them to 00:00:00.000 is an option you tick — never something applied behind your back.
What is a good reading speed for subtitles?
Around 20 characters per second for adult English, with a minimum on-screen duration of 0.833 seconds, at most 42 characters per line and at most 2 lines. Those figures come from the broadcast style guides; short-form social captions are usually read at a faster rate on shorter lines, which is the second preset here.
Will the repairs change my text?
Only the ones you tick, and only in the ways described next to each box. Timing repairs move a cue's end and never its start, so nothing is reordered and no cue is dropped. The two re-wrap repairs do rewrite where lines break, which is why they are off by default — a subtitler's line break is a decision about how the caption reads.
Is my subtitle file uploaded anywhere?
No. The file is read, parsed, retimed and written inside your browser tab. There is no upload, no server round trip and no account. Disconnect from the internet after the page loads and every part of this still works.