Use SRT when you need a subtitle file that works almost everywhere, WebVTT when captions are played in a web browser or need basic positioning, and ASS when you want full control over fonts, colours and placement, usually because you are burning the captions into the picture. All three store the same core information, text plus timing, but they differ sharply in how much styling they can carry and in who can read them.
The short answer in one table
| SRT | WebVTT (.vtt) | ASS / SSA (.ass, .ssa) | |
|---|---|---|---|
| Formal specification | No (de facto) | Yes, W3C | Informal, defined by the original software and later tools |
| Timecode example | 00:01:05,250 |
00:01:05.250 or 01:05.250 |
0:01:05.25 |
| Precision | Milliseconds | Milliseconds | Centiseconds (hundredths) |
| Styling | A few basic tags, patchy support | CSS-based styling, cue settings | Full: fonts, sizes, colours, outlines, shadows |
| Positioning | Minimal | Line, position, alignment, width per cue | Pixel-precise, rotation, animation |
| Native in web browsers | No | Yes, via the HTML track element |
No |
| Typical use | Delivery to platforms, editors, archiving | Web players, streaming, HTML5 video | Styled burn-ins, karaoke, anime fansub-style typesetting |
If you only remember one rule: SRT for exchange, VTT for the web, ASS for design.
SRT: the universal default
SRT is the format almost every tool can import and export, from YouTube Studio to Premiere Pro, DaVinci Resolve and every open-source subtitle editor. A block looks like this:
12
00:01:05,250 --> 00:01:08,000
This is an SRT cue.
Its strengths are simplicity and compatibility. Its weaknesses are that styling is barely defined, positioning is essentially absent and there is no formal standard, so edge cases behave differently from player to player. For a full line-by-line breakdown see what an SRT file is.
Choose SRT when you are delivering captions to a platform, handing files to a client or translator, or keeping a master transcript you will convert later.
WebVTT: the web's native format
WebVTT (Web Video Text Tracks) was designed for HTML5 video and is published as a W3C specification (>w3.org/TR/webvtt1). Browsers load it through the HTML track element, which is why most web video players, streaming services and e-learning platforms use it.
A minimal VTT file:
WEBVTT
00:01:05.250 --> 00:01:08.000
This is a WebVTT cue.
intro-2
00:01:08.400 --> 00:01:11.000 line:10% align:center
This cue sits near the top of the frame.
NOTE This is a comment and is never displayed.
The key differences from SRT:
- The file must start with
WEBVTT. - Milliseconds are separated by a full stop, not a comma.
- The hours field is optional, so
01:05.250is valid. - Cue numbers are optional; if present they are free-text identifiers such as
intro-2, which is useful for scripting and styling individual cues. - Cue settings after the end time control vertical line, horizontal position, alignment and width.
NOTEblocks allow comments, and aSTYLEblock can hold CSS using the::cueselector, although how much of that styling a given player honours varies.
Voice tags such as <v Sarah> can label speakers, and <c.classname> spans let a stylesheet colour parts of a line. Support for these in third-party players is less consistent than in browsers.
Choose WebVTT when captions will be played in a browser or web player, when you need a cue moved out of the way of on-screen text, or when a platform or LMS asks for it.
ASS and SSA: when design matters
SubStation Alpha (SSA) and its successor Advanced SubStation Alpha (ASS) come from a subtitle editor of the same name. They are now mostly written with Aegisub and rendered by the open-source libass library, which is what FFmpeg, mpv and many other players use. ASS is a styling format first: every line can have its own font, size, colour, outline, shadow, margin and alignment, and override tags can move, rotate, fade or animate text.
An ASS file is divided into sections:
[Script Info]
ScriptType: v4.00+
PlayResX: 1920
PlayResY: 1080
[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Arial,64,&H00FFFFFF,&H000000FF,&H00000000,&H64000000,-1,0,0,0,100,100,0,0,1,4,1,2,60,60,80,1
[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:01:05.25,0:01:08.00,Default,,0,0,0,,This is an {\c&H00FFFF&}ASS{\c} cue.
Dialogue: 0,0:01:08.40,0:01:11.00,Default,,0,0,0,,{\an8}Top of the frame.
Points worth knowing before you edit one by hand:
- Timing is in centiseconds (
0:01:05.25), so converting from SRT rounds to the nearest hundredth of a second. That is fine for viewing but worth remembering if you convert back and forth repeatedly. - Colours are written as
&HAABBGGRR: alpha first, then blue, green, red. Pure yellow is&H0000FFFF, not&H00FFFF00. Getting the byte order backwards is the classic ASS mistake. PlayResXandPlayResYdefine the coordinate space. Font sizes and margins are relative to it, so set it to your video's resolution to keep sizes predictable.- Alignment uses numpad positions: 1–3 along the bottom, 4–6 in the middle, 7–9 at the top, so
2is bottom centre and8is top centre.
Choose ASS when you are burning captions into the video and want control over the look, when you need karaoke-style word highlighting, or when you are building the punchy on-screen text common in short-form captions.
The catch is support: many platforms do not accept ASS uploads. At the time of writing, YouTube's supported-formats list does not include it, so check "YouTube Help: Supported subtitle and closed caption files" before relying on it. In practice ASS is usually a production format that ends up as pixels in the video, while SRT or VTT is delivered alongside it as the accessible, switchable track.
What about SBV, TTML and the rest?
You will occasionally meet other formats. SBV is a simple format YouTube has used for its own exports. TTML and its broadcast profiles (such as EBU-TT-D) are XML-based formats used in television and streaming delivery, often with strict requirements from the commissioning broadcaster. SCC and similar formats carry legacy US line-21 caption data. For typical creator work you can safely standardise on SRT and VTT and convert only when a client specification demands something else.
Converting between formats
FFmpeg converts between all three with a single command, choosing the output format from the extension:
ffmpeg -i captions.srt captions.vtt
ffmpeg -i captions.vtt captions.srt
ffmpeg -i captions.srt captions.ass
Be aware of what gets lost:
- SRT to VTT is essentially lossless for text and timing.
- VTT to SRT drops cue settings,
STYLEblocks andNOTEcomments. - SRT to ASS gives you a default style you will want to edit; timing is rounded to centiseconds.
- ASS to SRT throws away almost all styling and positioning, and override tags may need cleaning out of the text.
If you only need to shift or rescale timings rather than change format, our SRT shifter handles SRT and VTT in the browser.
Burning an ASS file into a video uses FFmpeg's ass filter, which keeps every style you defined:
ffmpeg -i video.mp4 -vf "ass=captions.ass" -c:a copy output.mp4
The >FFmpeg filters documentation lists the options for both the ass and subtitles filters.
A practical workflow that uses all three
This is the pattern we use and recommend for most creator projects:
- Master in SRT. Transcribe, correct and time the captions as a clean SRT. It is the easiest format to proofread, translate and version-control.
- Deliver SRT (or VTT) as closed captions. Upload the file to YouTube or supply VTT for a web player so viewers can switch captions on, off or resize them. The choice between burned-in and switchable captions is covered in open vs closed captions.
- Generate ASS only for styled burn-ins. Convert a copy of the master to ASS, apply your brand style and burn it in. If the words change, edit the SRT master and regenerate, rather than editing the ASS by hand.
Keeping one text master avoids the common problem of three slightly different versions of the same captions drifting apart after corrections.
Key takeaways
- SRT: maximum compatibility, minimal styling, comma before milliseconds.
- WebVTT: the browser standard,
WEBVTTheader, full stop before milliseconds, cue positioning. - ASS: complete styling control, centisecond timing, colours in
&HAABBGGRR, usually burned in. - Convert with FFmpeg, and expect styling to be lost whenever you move to a simpler format.
- Keep a single SRT master and derive everything else from it.
FAQ
Is WebVTT better than SRT?
For web playback, yes, because browsers support it natively and it can position cues. For general exchange between tools and platforms, SRT is still the safer choice because more software accepts it.
Can I just rename an .srt file to .vtt?
No. You also need to add the WEBVTT header line and change the comma before the milliseconds to a full stop. Converting with FFmpeg or a subtitle editor does both for you.
Why do my ASS colours come out wrong?
ASS stores colours in blue-green-red order with alpha first (&HAABBGGRR), which is the reverse of the familiar web hex order. Swap the red and blue pairs and the colour will usually be correct.
Which format should I upload to YouTube?
SRT is the straightforward choice and is accepted at the time of writing, as is WebVTT. Check YouTube Help for the current list, and burn in any ASS styling rather than uploading the ASS file itself.