Subtitle Converter
Paste or open an .srt or .vtt file, choose the format you need, and get it back converted. You can also move every cue earlier or later, stretch the timing by a factor, convert between frame rates, or pin the first and last cue to two known times — all in whole milliseconds, with the arithmetic exact. It runs in your browser and nothing is uploaded.
Runs entirely in your browser. Your subtitles and any file you open are never uploaded.
Paste subtitles or open a file to convert them.
How to Use the Subtitle Converter
- Paste or open the file. The format is detected from the text: a
WEBVTTheader means WebVTT, and a comma before the milliseconds means SubRip. - Choose the output. Pick WebVTT or SubRip. Cue numbers are always rewritten from 1 for SubRip; for WebVTT you can keep the original identifiers and cue settings, or renumber from 1.
- Retime if you need to. Shift by a number of seconds, multiply by a factor, convert from one frame rate to another, or enter the times the first and last cue should start.
- Check, then save. The table shows each cue's start before and after, and the checks flag overlaps, out-of-order and empty cues. Copy the result or download it as a .srt or .vtt file.
SRT and WebVTT Compared
| SubRip (.srt) | WebVTT (.vtt) | |
|---|---|---|
| Header | None | WEBVTT on the first line, then a blank line |
| Cue number | Required, counts from 1 | Optional identifier; may be any text without --> |
| Time format | 00:00:01,000 (comma, hours required) | 00:00:01.000 (full stop, hours optional) |
| Styling | <i>, <b>, <u> by convention; players differ | <i>, <b>, <u>, <c>, <v>, <lang>, <ruby> and CSS ::cue |
| Position and speakers | Non-standard tags such as {\an8} | Cue settings (align, position, line) and <v Name> voice tags |
| Where it works | Video players, editors and most video platforms | The HTML5 <track> element, which accepts WebVTT only, plus most players |
| Standard | A long-standing convention, never formally specified | A W3C specification, WebVTT: The Web Video Text Tracks Format |
What Happens in a Conversion
Going from SubRip to WebVTT, the tool adds the header, turns each comma into a full stop, and escapes what WebVTT does not allow in cue text: a bare & becomes &, a stray < becomes <, and --> inside text is escaped. <i>, <b> and <u> are kept; <font> tags and {\an8} position codes have no WebVTT equivalent and are dropped, so check cues you positioned at the top of the frame.
Going from WebVTT to SubRip, the header, NOTE, STYLE and REGION blocks and cue settings are removed. Voice tags become a Name: label so the speaker survives, timestamp and class tags are stripped, and &-style escapes are turned back into characters. Anything WebVTT can express and SubRip cannot — a cue's position, a stylesheet — is lost in that direction, so keep your .vtt original.
Shifting and Stretching Without Drift
A shift adds the same number of milliseconds to every start and end time. A stretch multiplies them: t′ = round(t × factor). Subtitles often drift because they were timed for a video at one frame rate and are played against the same film at another. The correct factor is the ratio of the two rates, and for the NTSC rates it is a fraction, not a decimal: 23.976 fps is exactly 24000/1001. The tool keeps that fraction and rounds each time once, to the nearest millisecond, so a long file does not pick up error cue by cue.
Match two times solves the common case where the start is right but the end is off, or both are off by different amounts. Say where the first cue should start and where the last should start; every other cue is placed proportionally between them.
Frame-rate example
A cue at 1:00:00.000 in subtitles timed for 23.976 fps, played with video at 25 fps: 3,600,000 ms × (24000/1001) ÷ 25 = 3,452,547.45 ms, so it moves to 00:57:32.547.
A negative shift can push early cues below zero. A cue that only starts too early is moved up to 00:00:00.000, keeping its end; a cue that ends before zero is dropped. Both counts are reported, so nothing disappears silently.
Frequently Asked Questions
- How do I convert SRT to VTT?
- Paste the .srt text or open the file, choose WebVTT as the output, and download the result. The converter adds the WEBVTT header, changes the millisecond separator from a comma to a full stop, and escapes characters WebVTT does not allow in cue text. Save it with a .vtt extension.
- Why do I need WebVTT instead of SRT?
- The HTML5 track element for captioning web video accepts WebVTT, not SubRip. If you are adding captions to a web page, convert to .vtt. Most desktop players and editing tools read either format.
- My subtitles are a few seconds late. How do I fix them?
- Choose Shift every cue by a fixed time and enter a negative number of seconds, such as −2.5 to show every cue 2.5 seconds earlier. If the offset grows through the film, the problem is frame rate, not a constant delay, so use the frame-rate option or match the first and last cue instead.
- How do I convert subtitles from 23.976 to 25 fps?
- Choose Convert between frame rates, select 23.976 as the rate the subtitles are timed for and 25 as the rate the video plays at. Every time is multiplied by 24000/1001 ÷ 25 (about 0.95904) and rounded to the millisecond. If the result drifts the other way, swap the two rates.
- Will this keep italics and positions?
- Italic, bold and underline tags are kept in both directions. WebVTT cue settings are kept when you convert WebVTT to WebVTT (for example to retime it) and dropped for SubRip. SubRip position codes like {\an8} and font tags have no WebVTT equivalent and are removed.
- Is my file uploaded?
- No. Parsing, retiming and writing all happen in your browser, and an opened file is read locally.