Shift Subtitles in a Time Range
Or paste subtitle text
Options
Milliseconds to move every cue by. A positive number pushes the subtitles later, a negative one pulls them earlier. Zero is a legal value: the file comes back unchanged, which is a quick way to confirm a file already sits where you want it.
Only cues that start at or after this time are moved. Leave it empty to move everything from the beginning of the file.
Only cues that start at or before this time are moved. Leave it empty to move everything to the end of the file.
Which frame rate the timings are counted in. On the format pages this is what MicroDVD needs, because it stores timing as frame numbers. On the frame rate pages it is the rate the file was timed against — the version the subtitles were made for — and the page's second box takes the rate of the video you are going to use them with. 23.976, 24, 25, 29.97, 30, 50, 59.94 and 60 are the common ones. Getting it wrong shifts the whole timeline, and on the frame rate pages it shifts it by a ratio rather than by a fixed amount.
This page shifts only the cues that start inside a time range, and leaves the rest of the file exactly as it was. Set a start time and an end time for the range, give an offset, and the subtitles that appear inside it move while everything before and after keeps its original timing. It is the tool for fixing one scene in a feature film or one segment of an episode without disturbing the file's alignment everywhere else.
A cue counts as being inside the range when its start time falls between the two bounds, and both bounds are inclusive. That rule is deliberately about where a cue begins rather than about how much of it overlaps the range, because a cue that straddles a boundary — starting before the range and ending inside it — would otherwise be half in and half out, and half a shift is not a shift. You can give just one bound: a start with no end moves everything from that moment to the end of the file, and an end with no start moves everything up to it.
If the offset pulls a block of cues earlier than the cues that preceded them, the file's timings are no longer in ascending order, and the page reports that it happened. The cue blocks themselves stay in the order they arrived, with the numbers they had, because the writer restores the source's block order on purpose — so what you get is a file whose cues are not sorted by time any more. Nothing is renumbered here; that is a separate job.
SRT, WebVTT, ASS, SSA, SBV, SAMI, MicroDVD, TTML, JSON and CSV files are accepted, each read as whatever format it actually is. Plain text and LRC are refused, since neither stores an end time for the offset to move. Nothing is uploaded, and a whole season goes through the queue in one pass.
Examples
Nudge one scene later
Input
1
00:00:01,000 --> 00:00:02,000
Before the range.
2
00:00:05,000 --> 00:00:06,000
On the lower edge.
3
00:00:07,000 --> 00:00:08,000
Inside.
4
00:00:12,000 --> 00:00:13,000
After the range.
Output
1
00:00:01,000 --> 00:00:02,000
Before the range.
2
00:00:05,300 --> 00:00:06,300
On the lower edge.
3
00:00:07,300 --> 00:00:08,300
Inside.
4
00:00:12,000 --> 00:00:13,000
After the range.
The second cue starts exactly on the lower bound, and it moves — both bounds are inclusive. The first and fourth cues sit outside and come back untouched, which is the point of the page.
Pull a late block back past an earlier one
Input
1
00:00:10,000 --> 00:00:11,000
Early in the file.
2
00:00:20,000 --> 00:00:21,000
Late in the file.
Output
1
00:00:10,000 --> 00:00:11,000
Early in the file.
2
00:00:05,000 --> 00:00:06,000
Late in the file.
Cue 2 is pulled back to 5 s and so now comes before cue 1 in time, while the two blocks keep the order and numbers they arrived with. The file's timings are no longer ascending, and the page says so.
Only one bound given
Input
1
00:00:01,000 --> 00:00:02,000
Untouched.
2
00:01:00,000 --> 00:01:02,000
Moved.
Output
1
00:00:01,000 --> 00:00:02,000
Untouched.
2
00:01:00,500 --> 00:01:02,500
Moved.
With a lower bound of one minute and no upper bound, everything from that moment onward moves and everything earlier does not.
Frequently asked questions
Which cues count as being inside the range?
Those whose start time falls between the two bounds, with both ends of the range included. A cue that begins exactly on either bound is inside it. Where a cue begins is the test rather than how much of the cue overlaps the range, so a cue that starts before the range and ends within it stays where it is.
Why does the range test use the start time and not the whole cue?
Because a cue that straddles a boundary is only partly inside the range, and there is no sensible way to move part of a cue. Testing the start gives every cue a single definite answer, and it matches how you think about a scene: the moment a subtitle appears is what places it in or out of the section you are fixing.
Can I shift everything after a certain point?
Yes. Fill in the lower bound only and leave the upper one empty, and every cue that starts at or after that moment moves while everything before it does not. Leaving the lower bound empty does the mirror of that, moving everything up to the upper bound.
What if no cue starts inside the range?
The file comes back unchanged. There is no offset applied and no cue removed, so the output is identical to the input — which also means the page has nothing to report. If you were expecting movement, check the range against the file's own timecodes rather than against a timeline that has already been shifted.
Does the output stay in time order when I move a block earlier?
Not necessarily, and the page reports when it does not. Pulling a block of cues back past the cues before them means the file's timings are no longer ascending, while the cue blocks stay in their original order with their original numbers. Players handle that in different ways, so check the result if you have moved a block across a neighbour.
Are the cue numbers rewritten after a range shift?
No. Every cue keeps the number it arrived with, and so does every cue that was not touched. Renumbering is a job of its own and doing it here would change lines you did not ask about, which is exactly what makes a range shift safe to use on one scene of a long file.