Subtitle formats
SRT vs VTT: what’s the difference, and which subtitle file should you use?
How the two most common subtitle files differ line by line, which platforms accept which, and how to convert between them without breaking the timing.
Updated 8 min readBy the AutoCap team
The short answer
Use SRT when you’re uploading captions to a video platform and aren’t sure what it wants. It’s the simpler of the two, and YouTube, Vimeo and LinkedIn all accept it. Use VTT (WebVTT) when the captions will play in a web page you control — an HTML5 player, a course platform, your own site — or when you need something SRT can’t express, such as moving a caption to the top of the frame.
Both are plain text. Both hold the same basic thing: a list of cues, each with a start time, an end time and the words to show. You can convert one into the other in seconds. The differences are small, but they’re exactly the details that make an upload fail.
What an SRT file is
SRT stands for SubRip Subtitle. It takes its name from SubRip, free software for pulling subtitles and their timings off DVDs into a text file. Each cue has four parts:
- A sequence number, counting up from 1.
- A timing line: the start and end times separated by
-->, each written ashours:minutes:seconds,milliseconds. - One or more lines of caption text.
- A blank line that ends the cue.
Hours, minutes and seconds are always two digits and milliseconds always three, so ten and a half seconds is 00:00:10,500. Vimeo’s help center spells out the same rule in its troubleshooting page for caption files.
That’s the whole format. Some players honor a few HTML-style tags in SRT, such as <i> for italics, but there’s no guarantee. YouTube, for example, says it supports only basic SRT files, recognizes no style markup in them, and requires plain UTF-8 text.
What a VTT file is
VTT is short for WebVTT, the Web Video Text Tracks format, a W3C specification. It’s the format browsers use for captions and subtitles attached to HTML5 video. Its cues look a lot like SRT’s, and it adds what a web player needs: positioning, styling, comments and speaker markup.
A WebVTT file must start with the word WEBVTT followed by a blank line, and it must be encoded as UTF-8. Served from a website, its MIME type is text/vtt. Cue numbers are optional — a cue can have any identifier, or none. Timestamps put a period before the milliseconds, and the hours can be left out when they’re zero, so 00:10.500 is valid.
The same captions in both formats
Here are three cues from a short tutorial, first as SRT:
1
00:00:01,200 --> 00:00:03,800
Welcome back. Today we're testing
three ways to light a small room.
2
00:00:04,100 --> 00:00:06,500
The first one costs nothing:
just move the desk to the window.
3
00:00:07,000 --> 00:00:08,400
[laughs] Seriously, try it.And the same cues as WebVTT, using a few features SRT doesn’t have:
WEBVTT
NOTE Lighting tutorial, English captions, v2
STYLE
::cue(.sound) {
color: yellow;
}
1
00:00:01.200 --> 00:00:03.800
<v Maya>Welcome back. Today we're testing
three ways to light a small room.
2
00:00:04.100 --> 00:00:06.500 line:10%
<v Maya>The first one costs nothing:
just move the desk to the window.
laugh
00:07.000 --> 00:08.400
<c.sound>[laughs]</c> Seriously, try it.Reading the VTT version from the top: the required header; a NOTE comment that players ignore; a STYLE block that colors anything tagged .sound; voice tags naming the speaker; a cue setting (line:10%) that moves the second caption near the top of the frame; a text identifier (laugh) instead of a number; and a final timestamp with the hours left off.
The differences that matter
The header
A VTT file without WEBVTT on its first line isn’t valid, and a strict parser will reject it. SRT has no header at all; the file starts with cue number 1. That’s why renaming captions.srt to captions.vtt doesn’t work: the header is missing and the timestamps still use commas.
Timestamps
SRT writes 00:00:04,100. VTT writes 00:00:04.100, or 00:04.100. A comma versus a period looks trivial, but a parser that expects one may refuse the other.
Positioning
VTT cue settings go on the timing line, after the end time:
line— the vertical position, as a line number or a percentage;position— the horizontal indent, as a percentage;size— the width of the cue box;align— text alignment: start, center, end, left or right;vertical— vertical text, for writing systems that need it;region— a named area defined in aREGIONblock, useful for scrolling captions.
That’s how you lift a caption out of the way of a name tag or other on-screen text. Basic SRT has no way to position a cue.
Styling
VTT supports inline tags — bold, italic, underline, class spans (<c>) and ruby annotations — plus STYLE blocks containing CSS for the ::cue pseudo-element. How much of that a player honors is up to the player. YouTube supports positioning in VTT files but limits styling to bold, italic and underline. If captions must look a particular way everywhere, the only reliable method is to burn them into the video.
Comments, speakers and languages
NOTE blocks hold comments — a translator’s note, a version number, a reminder — that viewers never see. Voice tags (<v Maya>) record who is speaking in a way software can read, and language spans mark a passage in another language. SRT has none of these. Every line of text in an SRT cue is shown to the viewer.
Captions, chapters and descriptions
On a web page, a VTT file is attached to a video with the <track> element, and its kind attribute says what the file is for. The HTML standard defines five kinds:
subtitles— a transcription or translation of the dialogue, for viewers who can hear the audio but don’t understand it. This is the default whenkindis missing.captions— dialogue plus sound effects, music and other relevant audio, for when the sound is unavailable or hard to hear.descriptions— text descriptions of what’s on screen, meant to be spoken by a speech synthesizer for viewers who can’t see the video.chapters— chapter titles for navigating the video.metadata— data for scripts, not shown to viewers.
<video controls src="lighting.mp4">
<track kind="captions" src="lighting.en.vtt"
srclang="en" label="English" default>
<track kind="chapters" src="lighting.chapters.vtt"
srclang="en">
</video>Browsers expect these files in WebVTT, so a site that only has SRT files needs to convert them first. Two practical details from MDN’s documentation: srclang is required when the kind is subtitles, and the track file must come from the same origin as the page unless the video element has a crossorigin attribute.
SRT vs VTT at a glance
| Feature | SRT | VTT (WebVTT) |
|---|---|---|
| File extension | .srt | .vtt |
| Origin | SubRip, a program for extracting DVD subtitles | W3C WebVTT specification |
| Header | None | WEBVTT on the first line (required) |
| Cue identifiers | Sequential numbers | Optional; any text |
| Timestamp | 00:01:04,100 | 00:01:04.100 or 01:04.100 |
| Hours | Always written | Optional when zero |
| Positioning | Not in the basic format | line, position, size, align, vertical, region |
| Styling | Some players read simple tags; YouTube ignores them | Inline tags, plus CSS in STYLE blocks |
| Comments | No | NOTE blocks |
| Speaker markup | No | <v> voice tags |
| Encoding | Use UTF-8 (YouTube requires it) | UTF-8 required |
| HTML5 <track> | No | Yes |
| Best for | Uploads to video platforms, handing files to other tools | Web players, course platforms, sites you control |
Which platforms accept which
Upload requirements change, so check the platform’s help page before a big batch. As of September 2026:
- YouTube accepts both, among many other formats. SRT files must be basic and plain UTF-8, with no styling; VTT files can carry positioning, with styling limited to bold, italic and underline. Step by step: how to upload an SRT file to YouTube.
- Vimeo accepts SRT and WebVTT for captions and subtitles, recommends WebVTT, and asks for UTF-8 encoding.
- LinkedIn’s help center describes attaching an SRT file when you post a video from the desktop site.
- HTML5 video on your own site uses WebVTT through
<track>.
Vertical short-form video is a different case. On TikTok, Instagram Reels and YouTube Shorts, burning captions into the picture is often the more practical choice, because the styling travels with the video in whatever app or setting it’s played. The trade-offs are covered in open vs closed captions.
How to convert between them
SRT to VTT
- Add
WEBVTTas the first line, followed by a blank line. - On every timing line, change the comma before the milliseconds to a period:
00:00:04,100becomes00:00:04.100. - Save the file as UTF-8 with a
.vttextension.
The cue numbers can stay; in VTT they simply become cue identifiers. Change commas only on the timing lines — a blind find-and-replace also changes every comma in the captions themselves. The free SRT to VTT converter does all three steps for you.
VTT to SRT
- Delete the
WEBVTTheader and anyNOTE,STYLEandREGIONblocks. - Number the cues from 1, replacing any text identifiers.
- Write every timestamp in full as
HH:MM:SS,mmm: add00:where the hours were left out, and change the period to a comma. - Remove cue settings such as
line:10%from the ends of the timing lines. - Strip voice, class, language, ruby and timestamp tags. If a voice tag named a speaker that viewers need to know about, turn it into a visible label.
This direction loses information — positions, styles and speaker markup — so keep the original VTT. The VTT to SRT converter handles the renumbering and timestamp rewriting. If the converted captions are consistently early or late, that’s a separate problem: move every cue at once with the subtitle timing shifter.
Which one should you use?
- Uploading to YouTube, Vimeo or LinkedIn: SRT works on all three. On YouTube or Vimeo, switch to VTT if you need positioning.
- Your own website or course player: VTT, attached with
<track kind="captions">. - Handing captions to an editor or translator: ask what their tools read. If they don’t say, SRT is the safer default.
- Keeping a master copy: export both from the same corrected transcript, so a fix lands in both files.
Whichever you pick, the words and timings matter more than the container. A perfectly formatted file with a misheard name in cue 12 is still wrong. AutoCap’s SRT generator and VTT generator write both formats, on paid plans, from the transcript you’ve corrected, with a timing for every word — so the two files never disagree.
Questions
Can I rename an .srt file to .vtt?
Not on its own. A VTT file needs WEBVTT on its first line and a period instead of a comma before the milliseconds. Add the header and fix the timestamps, or run the file through an SRT to VTT converter.
Does YouTube prefer SRT or VTT?
YouTube accepts both. SRT is the simplest choice. Use VTT if you need a caption positioned away from the default spot: YouTube supports positioning in VTT files but ignores styling markup in SRT files.
Which subtitle format supports styling?
WebVTT. It has inline tags and CSS through STYLE blocks, although each player decides how much of it to honor. SRT has no standard styling, and YouTube ignores markup in SRT files.