SRT vs VTT vs ASS vs TTML — what each format actually supports
Most "which subtitle format" answers list the file extensions and stop there. The differences that actually cost you a delivery are narrower: whether a browser will play it at all, whether the styling survives a conversion, and whether the file declares its own encoding. This page puts the five formats you are likely to meet side by side, then lists the four things that break when you move between them.
Compiled from the specifications and from what our own parsers implement — the studio reads and writes SRT, WebVTT, ASS/SSA, TTML and iTT, which is why the awkward cases below are specific rather than general.
The comparison
| Property | SRT | WebVTT | ASS / SSA | TTML (IMSC) | iTunes iTT |
|---|---|---|---|---|---|
| Where it comes from | De-facto format, no published specification | W3C specification | SubStation Alpha lineage, community-maintained | W3C specification; IMSC is its streaming profile | Apple's TTML subset for HLS |
| Timestamp syntax | 00:00:01,000 --> 00:00:04,000comma before milliseconds |
00:00:01.000 --> 00:00:04.000dot; 01:00.000 short form allowed |
0:00:01.00centiseconds, one-digit hour |
begin="00:00:01.000" attributes on elements |
begin="00:00:01:00"frame-based |
| Cue numbering | Required integer above each cue | Optional — the line is a cue identifier | Inside [Events] rows, no numbering |
Not applicable (XML tree) | Not applicable (XML tree) |
| Styling | None in the format. Some players honour <b> / <i> / {\an8}
conventions; others print them literally |
Limited: <b> <i> <u> <c> plus ::cue CSS, which player
support varies on |
Full: fonts, colours, outlines, shadows, per-event overrides | Full: styles and regions defined once, referenced by cues | Limited to what Apple's profile allows |
| Positioning | Not in the format; only through player-specific tags | Cue settings: line, position, align, size |
\pos, \an, \move against a PlayRes canvas |
<region> with explicit extents |
Very limited |
| Karaoke / per-word timing | No | Timestamps inside a cue's text; playback support varies | Yes — \k and friends are core to the format |
Possible, via timing on spans | No |
| Encoding | Nothing declared — legacy files are often GBK, CP1252 or UTF-16 with no marker | Must be UTF-8 | Usually UTF-8, historically legacy encodings too | XML declaration states it | XML declaration states it |
| Native in a browser | No — convert to WebVTT first | Yes — what <track> loads |
No | No | No |
| Typical use | Quick delivery, anything that accepts "subtitles" | Web video, HTML5 players | Fansub and styled releases; local players | Broadcast and OTT deliveries | Apple HLS / iTunes packages |
The four things that break on conversion
| What happens | Why | What to do instead |
|---|---|---|
Renaming .srt to .vtt produces a file that will not load |
WebVTT requires the WEBVTT header and dot decimals; a renamed file has neither |
Run a real conversion: header, dot decimals, cue numbers become identifiers — SRT to VTT converter |
| Styling disappears, or appears as literal backslash codes on screen | SRT has no styling model; converters either drop tags or copy them through as text | If styling is part of the deliverable, keep ASS or TTML and let the receiver transcode |
| Timings drift after a frame-rate change | Retiming is arithmetic on every timestamp, not a copy step: a 25 → 23.976 change costs about 9.95 seconds a minute if the file is not recomputed | Frame-rate converter, or one fixed offset when the whole file is simply late |
| Text renders as mojibake on someone else's machine | An SRT with no encoding declaration is decoded with whatever the receiving tool guesses | Convert to UTF-8 before sending; the studio detects GBK / UTF-16 / BOM on the way in and writes UTF-8 on the way out |
Which one should you deliver?
Three questions decide it, in this order:
- Did the receiver name a format? Then that is the answer — and if they named a TTML or IMSC profile, deliver that, not an SRT converted at the last minute.
- Will it play in a browser? Only WebVTT will. If the answer has to be "it just works in a web player", the target is VTT.
- Does anyone need the styling, positioning or karaoke? If yes, ASS (local playback, fansub workflow) or TTML/IMSC (delivery to a platform) — SRT cannot carry it, and VTT carries very little of it.
Everything else — plain text, one language, correct timings — is what SRT is for, and it is still the format that opens everywhere.
Converting a batch, not a file?
The studio opens SRT, WebVTT, ASS, TTML and iTT in one workspace, converts between them, and exports a batch as a ZIP with a per-file report. Single-file conversion stays free; Pro is a $9 one-time licence — lifetime, up to 3 devices, 7-day refund while the key is unactivated.
Quick answers
Can I just rename a .srt file to .vtt?
No. WebVTT requires a WEBVTT header line, the timestamp separator becomes a dot, and the cue
number becomes an optional identifier. A renamed file is missing the header, so a compliant player rejects the
whole file — the failure is total, not partial.
Which format does a browser play natively?
Only WebVTT. SRT, ASS/SSA, TTML and iTT all have to become WebVTT before a <track> element
can show them, whatever local desktop players accept.
Does converting to SRT lose styling?
Yes, silently: SRT has no styling model, so colours, fonts, positions and karaoke are not representable. Tools either drop the tags or pass them through as literal text that then renders on screen.
Which of these is a standard?
WebVTT and TTML are W3C specifications (IMSC is TTML's streaming profile); SRT has no published specification and is defined by what players accept; ASS/SSA is community lineage; iTT is Apple's TTML subset. The more formal the format, the less the tools disagree — and the more setup it needs.