SRT to VTT Converter (and Back) for Web Video Subtitles
SubRip and WebVTT carry the same cues, but their headers and separators differ enough that a browser accepts one and ignores the other. SRT uses a comma before the milliseconds and no header at all, while WebVTT starts with the word WEBVTT and uses a dot. This tool converts in either direction, keeps cue text intact, and reports anything the parser could not read. Paste a file or load one from disk; nothing you enter leaves the browser.
Convert Subtitles in This Tab
How It Works
Conversion is a parse followed by a rewrite. Each timing line is read into seconds and printed again in the target format, so a comma becomes a dot on the way to WebVTT and a dot becomes a comma on the way back. Output for a browser gains the WEBVTT header it needs. Going back to SRT, that header disappears and each cue is numbered again from the top.
SRT also carries placement inside the cue text as an ASS-style code with a backslash, the letters an, and a digit from 1 to 9. With the mapping box on, that digit is rewritten as cue settings on the timing line, such as line:0% for a top row or line:50% for a middle row. With the box off, the code stays in the cue. A coordinate trail after the end time has no WebVTT form, so it is dropped and reported as a note.
Markup follows the target too. On the way to WebVTT, speaker, bold, italic, and class tags stay as they are. On the way to SRT they are stripped, since an SRT reader would print the angle brackets inside the caption. Anything the parser could not read is listed under the output as an error or a warning, so a skipped block never passes silently.
Before and After
Two runs of the converter, printed exactly as the output pane shows them. The first keeps the cue wording and changes the header, the separators, and the placement, while the second walks the other way and shows the settings disappearing.
SRT input
1
00:00:02,400 --> 00:00:05,000
{an8}Welcome back to the show
VTT output
WEBVTT
00:00:02.400 --> 00:00:05.000 line:0%
Welcome back to the show VTT input
WEBVTT
00:00:01.500 --> 00:00:04.000 line:90%
First caption line
SRT output
1
00:00:01,500 --> 00:00:04,000
First caption line Use Cases
| Setting | File you have | What you get |
|---|---|---|
| HTML5 video page | An SRT export from a transcription tool | A track file with the WEBVTT header a browser expects |
| Course or player upload | A VTT file with cue settings and speaker tags | Numbered SRT blocks for an uploader that takes SubRip only |
| Caption review | Cues that overlap or sit on screen too long | A warning list before the file reaches an editor |
Common Mistakes
- Shipping a file with no WEBVTT header. Browsers look for that word on line one and show nothing when it is missing, so the track looks loaded while every cue stays blank.
- Leaving a comma before the milliseconds in WebVTT, or a dot in SRT. This parser accepts either on input, but a strict player does not, and the mismatch is the usual reason a file works in one tool and fails in another.
- Trusting a positioning code that the player never reads. An override such as {an8} means nothing to a player that only understands cue settings, so turn on the mapping box before converting.
- Assuming coordinate trails carry over. Text after the end timestamp positions the cue in SubRip, has no WebVTT form, and is dropped with a note rather than guessed at.
- Pasting cue text with a blank line in the middle. Blocks split on blank lines, so the second half becomes a block with no timing and is skipped with an error.
Best Practices
- Preview the converted file in a real player before publishing. A video element with a track child takes a few lines of HTML and shows exactly what a visitor will see.
- Keep the original beside the converted file. Timing and wording round-trip in both directions, but dropped coordinates and stripped tags cannot be recovered.
- Strip tags for the target when the caption must look identical everywhere. SRT output does this on its own, since SRT has no syntax for voice, bold, italic, or class tags.
- Read the notes after every run. They report what was mapped, what was dropped, and which cues carried positioning.
- Fix timing warnings before upload. Overlaps and cues that stay up past seven seconds show as amber items, and they are quicker to repair here.
Frequently Asked Questions
What does this converter change in an SRT file?
It writes the WEBVTT header, swaps the comma before the milliseconds for a dot, and rewrites every timing line. Sequence numbers are dropped because WebVTT does not need them. Position coordinates are removed and reported as a note.
What happens when I convert VTT back to SRT?
The header goes, dots become commas, and cues are renumbered from 1 upward. Cue settings such as line and position are dropped and reported as a note. Speaker, bold, italic, and class tags are stripped because SRT readers print them literally.
What does the mapping checkbox do with positioning codes?
SRT placement arrives as an ASS-style code with a backslash, the letters an, and a digit from 1 to 9. Checked, that digit becomes cue settings such as line:0% for a top row. Unchecked, it stays in the cue text.
Should I keep the original subtitle file?
Yes. Timing and wording survive both trips, but coordinates, tags, and settings do not. Keeping the source lets you convert again with a different option instead of repairing output by hand.
Why does my converted file show nothing in the player?
Check the header first. A track file that does not begin with the word WEBVTT is ignored, and so is one where the header touches the first cue. Then look at the separators and at the issues box.
Can the converter handle a full-length subtitle file?
Yes. Parsing and rewriting run inside the tab, so a couple of thousand cues finish in a moment and never cross the network. The stats line reports the cue count and time range, which confirms the whole file was read.
Does any part of my subtitle file leave the browser?
No. The file picker reads locally, the textarea holds the text, and conversion runs as code in the page. Copying uses the clipboard and downloading builds a local blob, so no request carries your captions anywhere.