TimecodaLabsubtitle timeline studio
Open the full studio

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

PropertySRTWebVTTASS / SSATTML (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,000
comma before milliseconds
00:00:01.000 --> 00:00:04.000
dot; 01:00.000 short form allowed
0:00:01.00
centiseconds, 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 happensWhyWhat 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:

  1. 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.
  2. 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.
  3. 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.

Open the studio

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.