How to Convert SRT to VTT for Web Video — Free Guide | AllSubConverter
If you have ever embedded a video on a website only to see the subtitles refuse to load, the format is almost always the culprit. Most subtitle files floating around the internet are SRT, but browsers expect VTT. This guide explains exactly why that is and shows you how to convert SRT to VTT in seconds.
Why Web Players Need VTT
The HTML5 <video> element was designed with accessibility in mind, and it exposes a <track> child element for captions and subtitles. The catch is that the <track> element officially supports only one text-track format: WebVTT (Web Video Text Tracks).
Try pointing a <track> at a raw .srt file and most browsers will silently ignore it. The caption button appears, the file downloads, but nothing renders. That is why a conversion step is unavoidable for anyone shipping video on the web.
The short version: HTML5 only speaks VTT. If you serve SRT, captions stay invisible.
SRT vs VTT — What Actually Changes
The two formats look similar, and the textual content is usually identical cue-for-cue. The differences are small but strictly enforced:
| Aspect | SRT | VTT |
|---|---|---|
| Header | None | Must start with WEBVTT |
| Time separator | Comma before ms (00:01:02,500) |
Period before ms (00:01:02.500) |
| Cue index numbers | Required (1, 2, 3…) | Optional |
| Cue settings | Not supported | Supported (align:center line:90%) |
| Inline styling | Not supported | Supported via <b>, <i>, <u> |
The two timestamp rules are the ones that break playback. A browser parsing VTT expects a period as the millisecond separator; the comma used by SRT is treated as a malformed cue and the entire block gets skipped.
The WEBVTT Header Requirement
Every valid VTT file must begin with the literal string WEBVTT on the first line, followed by a blank line. Without this header, browsers reject the file outright. A minimal VTT file looks like this:
WEBVTT
00:00:01.000 --> 00:00:04.000
Welcome back to the series.
00:00:04.500 --> 00:00:07.000
Today we convert subtitles for the web.
Compare that to the SRT equivalent, which has numbered cues and comma-separated timestamps:
1
00:00:01,000 --> 00:00:04,000
Welcome back to the series.
2
00:00:04,500 --> 00:00:07,000
Today we convert subtitles for the web.
Step-by-Step: Convert SRT to VTT
- Open the converter. Head to the SRT to VTT tool. There is nothing to install or sign up for.
- Upload your SRT file. Drag and drop the file, paste its text into the box, or pick it from your device. Multiple files are supported for batch jobs.
- Let the converter run. The tool inserts the
WEBVTTheader, swaps every comma timestamp separator for a period, and normalizes cue formatting. - Download the VTT file. Copy the result or save it next to your video with a matching filename so the browser associates them automatically.
- Wire it into your player. Reference the file from a
<track>element and you are done.
A typical HTML5 setup looks like this:
<video controls>
<source src="intro.mp4" type="video/mp4">
<track label="English" kind="subtitles"
srclang="en" src="intro.vtt" default>
</video>
Browser Compatibility Benefits
Converting to VTT is not just about passing a parser — it unlocks real browser features:
- ✅ Native caption controls in Chrome, Firefox, Safari, and Edge without any JavaScript
- ✅ Accessible cues picked up by screen readers through the
kind="captions"attribute - ✅ Right-to-left and vertical writing modes for languages that need them
- ✅ Chapter markers via
kind="chapters" - ✅ Cue-level positioning so you can push subtitles away from on-screen text
VTT also plays nicely with major web players like Video.js, Plyr, Shaka Player, and the YouTube IFrame API, so a single converted file works across custom builds and off-the-shelf players alike.
Common Pitfalls to Avoid
- Double headers. If your source already contains a stray
WEBVTTline, a naive copy-paste can produce two. The converter deduplicates this for you. - BOM and encoding issues. Save VTT as UTF-8 without a byte-order mark, otherwise some players misread the header.
- MIME type. Serve the file as
text/vtt. A genericapplication/octet-streamwill be blocked by strict browsers. - CORS. When the VTT lives on a different domain than the page, the server must send the right CORS headers or captions silently fail.
Common Questions
Can browsers just read SRT directly?
Officially, no. The HTML5 spec only requires browsers to support WebVTT inside <track>. A few browsers are lenient and will attempt to parse an SRT, but this is unreliable, inconsistent across versions, and not something to depend on for production video.
Does conversion change the timing?
Not at all. The hours, minutes, seconds, and milliseconds are identical — only the character between seconds and milliseconds changes from a comma to a period. Cue durations and sync points stay exactly the same.
Should I keep the SRT cue numbers?
VTT makes cue numbers optional, and most converters drop them since the blank-line separation is what defines a cue. Leaving them in is harmless, but removing them produces a leaner file that is easier to diff and edit by hand.
How do I add captions in multiple languages?
Add one <track> element per language, each with its own srclang and label. Mark a single track with default to control which language shows first, and let the viewer switch from the player's caption menu.
Ready to Make Your Captions Web-Ready?
Convert your SRT file to clean, browser-compatible VTT in one click — free, private, and instant.
Convert SRT to VTT Free →If you are going the other direction and need plain subtitles for a desktop player or TV, our VTT to SRT guide walks through that workflow.