Convert SRT subtitles to VTT, and VTT subtitles to SRT
SRT and VTT (WebVTT) are text subtitle formats that live in a separate file next to the video. Paste subtitles into the converter above or open a file, and it detects the format and converts to the other one right away. Start and end times are kept to the millisecond, and only the parts the two formats write differently are rewritten by rule: the comma or period in timestamps, formatting tags and position markup.
You can play the result on screen to see the cues appear at their times. Open your own video file and the result is laid over it, so you can check it against the dialogue. If it is off, enter seconds in Sync shift and every cue moves together. Pasted subtitles and opened videos are never sent to a server; everything is processed inside this browser.
When you need to change the subtitle format
The two formats look alike, so renaming the file seems enough. But if the format is not the one the receiving side expects, the subtitles may not show up at all or the timestamps may not be read. These are the usual cases.
- Adding captions to a web page video: the HTML
<track>element, which attaches subtitles to a video, uses WebVTT files (MDN). To use an SRT from an editing program on a web video, convert it to VTT. - Uploading to YouTube: YouTube accepts both formats, but its help page says SRT supports only the basic format, does not recognize formatting and must be a UTF-8 file. It lists positioning and bold, italic and underline (b, i, u) for WebVTT. If you want to keep italics or captions at the top of the screen, upload VTT.
- Using a VTT downloaded from the web elsewhere: to use a VTT from an online course or a meeting recording in a player or editor that accepts only SRT, convert it to SRT.
- Keeping the format and only fixing the sync: if you trimmed the start of a video or added an intro and the subtitles are now early or late by a constant amount, choose the same format as the source, enter the sync shift and save.
How to use the converter
- Add subtitles: paste into the text box below or press Open file. You can also drag a file onto the workspace. The sample shown at first is fully selected when you click the box, so pasting replaces it at once.
- Check the format: the Source label at the top shows the detected format and the number of cues. The output format is set to the opposite one; to shift the sync only, pick the same format as the source.
- Play it on screen: press the play button or the screen and the result cues appear at their times. Click a bar on the timeline to jump to that cue, then use the arrow keys to move to the previous or next one. The comparison panel shows the source lines and result lines of the current cue together.
- Try my video: open a video file and the screen becomes that video with the result subtitles on top. The video plays only in this browser.
- Fix the sync: if subtitles appear later than the speech, enter a negative number in Sync shift (−0.5); if earlier, a positive one (+0.5). The − and + buttons move by 0.1 s.
- Review the changes and take the result: click a chip in the change list to step through the cues of that kind. Save downloads a .vtt or .srt file, or use Copy. The ⇄ button in the middle moves the result to the source so you can convert back the other way.
How SRT and VTT differ
| Item | SRT | VTT (WebVTT) |
|---|---|---|
| First line | None (cue 1 starts at once) | Must start with WEBVTT; without it the file is not read |
| Cue number | Numbered in order from 1 | Optional (an identifier, which may also be text but must not repeat within the file) |
| Timestamp | 00:01:02,500 (comma) | 00:01:02.500 (period); with zero hours 01:02.500 is also allowed |
| Cue order | No fixed rule | A cue may not start earlier than the one before it; overlaps are allowed |
| Formatting | Bold, italic, underline and color tags that came from HTML | b, i, u, c (class), v (speaker), ruby, lang and per-word timestamps |
| Text color | <font color> | Eight default color classes (white, lime, cyan, red, yellow, magenta, blue, black); any other color needs CSS in a STYLE block |
| Position | No defined way | Settings at the end of the timing line (line, position, align and others) |
| Notes and styles | None | NOTE, STYLE and REGION blocks |
| Special characters | Written as they are | & and < are written & and <; --> is not allowed inside a cue |
| Encoding | No defined standard | UTF-8 |
| Specification | No formal specification (Library of Congress) | W3C WebVTT |
What is carried over and what is dropped
Markup that exists in only one format is carried over when the other format has an equivalent. When there is no place to put it, the text stays and only the markup is dropped. The change list shows how many items were dropped, and the comparison panel shows what changed in each cue.
| Source | Result | Explanation |
|---|---|---|
| SRT → VTT | ||
<i>word</i> | <i>word</i> | b, i and u exist in both formats, so they stay. |
<font color="#ffff00">word</font> | <c.yellow>word</c> | A color that matches one of the eight WebVTT default colors becomes a color class. |
<font color="#ff8800">word</font> | word | Colors outside the eight defaults, and font tags, lose only the tag. |
{\an8}word | word | Top-of-screen markup ({\an7} to {\an9}) becomes line:0 at the end of the timing line; any other {\…} markup is dropped. |
A & B < C | A & B < C | Symbols that cannot be written as plain text in VTT become character references. |
| VTT → SRT | ||
<v Sam>word | word | The speaker tag is dropped. With the switch on, the name goes in front, like Sam: word. |
<c.yellow>word</c> | <font color="yellow">word</font> | The eight default color classes become a font color. |
<c.note>word</c> | word | A class defined in STYLE means nothing in SRT, so it is dropped. |
<00:00:01.500>word | word | SRT has no per-word timestamps, so they are dropped. |
<ruby>漢字<rt>kanji</rt></ruby> | 漢字(kanji) | Ruby (the reading) goes in parentheses. |
& < | & < | Character references are decoded to text. |
00:00:01.000 --> 00:00:02.000 align:start | 00:00:01,000 --> 00:00:02,000 | SRT has no place for position and alignment settings, so they are dropped. |
NOTE, STYLE and REGION blocks | (dropped) | Notes and style definitions are dropped too, and so are the Kind: and Language: lines in the file header. |
If you pick the same output format as the source, none of the conversions in the table are applied: text, settings and blocks stay as they are and only the times move. When converting VTT to SRT the cues are renumbered from 1, and when converting SRT to VTT no numbers are written.
How one cue changes
Two cues written like cues 4 and 5 of the sample SRT, with a text colour and a top-of-screen tag, converted to VTT.
| SRT source | VTT result |
|---|---|
4
00:00:09,700 --> 00:00:12,600
<font color="#ffff00">Yellow text</font> stays
5
00:00:11,800 --> 00:00:14,000
{\an8}[Top] A & B | WEBVTT 00:00:09.700 --> 00:00:12.600 <c.yellow>Yellow text</c> stays 00:00:11.800 --> 00:00:14.000 line:0 [Top] A & B |
Cue 4 uses yellow (#ffff00), one of the eight WebVTT default colors, so it became c.yellow. In cue 5 the top-of-screen markup became line:0 and & was written as &. The two cues overlap by 0.8 s, from 11.8 s to 12.6 s, and are left as they are. WebVTT allows cues to overlap, and the overlap may be deliberate, as when two people speak at the same time.
How the sync shift is calculated
The value you enter is added equally to the start and end time of every cue. If the result is before 0 s, the start is set to 0 s, and a cue whose end also falls before 0 s is dropped from the result.
| Source time | +1.5 s | −2 s |
|---|---|---|
00:00:01,000 --> 00:00:03,400 | 00:00:02,500 --> 00:00:04,900 | 00:00:00,000 --> 00:00:01,400 (start set to 0 s) |
00:00:00,500 --> 00:00:01,800 | 00:00:02,000 --> 00:00:03,300 | Dropped (the end is also before 0 s) |
If the subtitles match at first but drift further apart as the video goes on, a single value cannot fix it. This happens when the video the subtitles were timed against plays at a different speed from yours, and this converter does not stretch or squeeze times by a ratio.
Common mistakes
- Only renaming the extension: if you rename an .srt file to .vtt, the first line has no WEBVTT, so a reader that follows the WebVTT specification will not read the file at all. The commas in the timestamps also stay.
- Mixing commas and periods: in an SRT edited by hand, a period such as
00:00:01.500is not read by some programs. This converter accepts both when reading and rewrites them to fit the output format; each fix is counted in the change list as "Time separator fixed". - Missing blank lines between cues: SRT separates cues with blank lines. If a blank line is missing, the next number and timing can be read as part of the previous cue's text. The converter splits them by looking at the number and timing lines and reports "Merged cues separated".
- A cue that ends before it starts: this often happens when editing times by hand. There is no way to guess which value is right, so the conversion stops and tells you the line number; press Show in source to jump to that line.
- Uploading subtitles in an old encoding as they are: some older SRT files are saved in Windows-1252. YouTube says SRT files must be UTF-8, so open the file here and save it to get a UTF-8 file before uploading.
- Deleting overlapping cues as errors: overlapping cues, shown hatched on the timeline, may have been overlapped on purpose. Play the video and fix the source only if it is really wrong.
Limits and cautions
- SRT and VTT text files up to 10 MB and 20,000 cues can be converted. Other subtitle formats such as SMI, ASS and SBV are not read.
- The preview shows the times and text of the result cues, basic formatting and color, and top-of-screen placement. Font, size and position in a real player can differ, and CSS in a STYLE block is not used in the preview.
- A video opens only if this browser can play its format. Neither the video nor the subtitles are sent to a server.
- If a cue ends before or at its start, or a time cannot be read, nothing is converted. Cues without text are dropped and the count is reported.
- The result is saved as UTF-8 (no BOM) with LF line breaks.
As of the format rules and platform guidance were checked against the original sources on 2026-10-20.
Sources
- 01W3C: WebVTT, The Web Video Text Tracks FormatStarts with WEBVTT, UTF-8, timestamp format, unique identifiers, start-time order and overlap allowed, no --> inside a cue and & < character references, eight default color classes, NOTE, STYLE and REGION
- 02Library of Congress: SubRip Subtitle format (SRT)Number, timing (comma), text and blank-line structure, no formal specification, bold, italic, underline and color from HTML, no encoding standard
- 03MDN: <track> elementSubtitle track files for video and audio use the WebVTT (.vtt) format
- 04YouTube Help: Supported subtitle and closed caption filesSRT basic format only, formatting not recognized, UTF-8; WebVTT supports positioning and b, i, u formatting
- 05WHATWG: Encoding StandardThe windows-1252 label browsers read, and the UTF-8 BOM
Frequently asked questions
How do SRT and VTT differ?
Both are text subtitles kept outside the video. VTT (WebVTT) is a W3C specification: the first line is WEBVTT, a period comes before the milliseconds, and you can add position, styles and notes. SRT separates number, timing and text with blank lines, puts a comma before the milliseconds, and is a widely used format with no formal specification.
Does converting SRT to VTT change the sync?
No. Start and end times are kept to the millisecond and only the notation changes, from 00:00:01,250 to 00:00:01.250. Times move only if you enter a value in the sync shift box, and then every time moves by that amount.
How do I fix subtitles that appear later than the video?
Open your video with Try my video, play it and see how far off the subtitles are. If they are late, enter a negative sync shift (for example −0.8); if they are early, a positive one. A start pushed before 0 s becomes 0 s, and a cue whose end is also before 0 s is dropped. If the gap grows toward the end, a single value cannot fix it.
Do formatting like italics and color stay?
b, i and u tags stay in both formats. Of the font colors in SRT, the 8 WebVTT default colors (white, lime, cyan, red, yellow, magenta, blue, black) become a color class such as c.yellow, and font color again when converting back. Other colors and font tags lose only the tag and keep the text.
What happens to VTT position settings, NOTE and STYLE when I convert to SRT?
SRT has no place for them, so they are dropped. The change list shows how many were dropped and the comparison panel shows what was dropped from each cue. To shift only the sync and keep everything, leave the output format as VTT and the settings and blocks all stay.
What if the subtitles show garbled characters?
When you use Open file, the encoding is detected in the order BOM, UTF-8, Windows-1252, and the one used is shown above the text box. The result is always saved as UTF-8, so an old Windows-1252 file becomes UTF-8 once you open and save it. If you pasted text that was already garbled, open the original file again.
Are my subtitle or video files uploaded?
No. Conversion and video playback both happen inside this browser. Pasted text and opened files are not sent to a server, and are not kept in the address or in storage.
What files can be converted?
SRT and VTT text files up to 10 MB and 20,000 cues. Other subtitle formats such as SMI, ASS and SBV are not read. If a cue ends before it starts or a time cannot be read, the conversion stops and tells you the line number.