subtitle · 9 min read

SRT, VTT, ASS and SBV — what each one actually holds

They all look like a time, a time and some words. The differences only appear when you convert one into another and something disappears.

Four formats, and the useful way to tell them apart is not by their syntax but by what they are able to remember. A format can only carry what it has fields for, so conversion is a question of what fits — and every conversion downwards is permanent.

SubRip (.srt) — the one everything reads

A number, a timing line, one or more lines of text, a blank line. That is the entire format.

1
00:00:01,000 --> 00:00:04,000
Ready when you are.

It has no specification. It was the output format of a piece of Windows software in 2000, and it spread because it was simple enough that anyone could write a parser for it in an afternoon. That absence of a standard is why every parser is slightly different, and why the ones that matter are forgiving.

What it holds: a start, an end, and text. Most players also honour <i>, <b> and <u> inside the text, which is a convention rather than part of the format — some render them and some print them as characters on screen.

What it does not hold: position, colour, font, alignment, or any notion of who is speaking. The index numbers are required and carry nothing: they have to be sequential, and any decent tool rebuilds them rather than trusting them, because half the files in circulation have them duplicated after someone deleted a block by hand.

WebVTT (.vtt) — the one browsers read

The same shape with four differences, and each of them will stop a file working if you get it wrong.

WEBVTT

00:00:01.000 --> 00:00:04.000 line:0 position:50%
Ready when you are.

The header is mandatory. The first line must read WEBVTT. The separator is a full stop, not a comma. The index is optional and usually absent. And cue settings are allowed after the end time — line:0 position:50% align:start — which is how a caption gets moved off the bottom of the frame.

It also allows NOTE, STYLE and REGION blocks, and those matter to a parser rather than to you: a NOTE block can contain anything, including something that looks exactly like a timing line, and a parser that does not skip to the next blank line reads a comment as dialogue.

WebVTT is a genuine specification with a working group behind it, which is why browsers are strict about it and why hours are lost to a missing header.

Advanced SubStation Alpha (.ass, .ssa) — the one with a stylesheet

A different kind of file entirely. It has sections in square brackets, a table of named styles with fonts and colours and outlines, and events that carry a layer, a style name, three margins and an effect before they reach the words.

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:01.00,0:00:04.00,Default,,0,0,0,,{\an8}Ready when you are.

This is what Aegisub saves and what almost every fansub is distributed as, because it can do typesetting — a sign on a wall in the shot, translated, in a matching font, at the right angle. Four things about it catch people out.

The timestamps are centiseconds. Two digits after the full stop, not three. 0:00:05.50 is five and a half seconds, and reading those digits as milliseconds puts the whole track 450 ms early — small enough to feel like sloppy timing rather than a bug.

The column order is declared, not fixed. The Format: line names the columns, and SSA v4 begins with Marked where ASS v4+ begins with Layer, so every field after the first sits one place along.

Braced tags are instructions. {\an8}, {\i1}, {\c&HFFFFFF&}. Converted to SubRip they have nowhere to go, and a converter that keeps them puts them on screen as dialogue.

Some events are not text at all. An event wrapped in {\p1} is a vector drawing, and its body is a list of coordinates.

SBV (.sbv) — the one YouTube hands back

The simplest of the four and the one with the nastiest trap.

0:00:01.000,0:00:04.000
Ready when you are.

No header, no index, no styling, nowhere to put any. And a comma — between the two timestamps, where SubRip puts one inside each of them. Both formats therefore have a comma between two numbers, and a tool that keys on the comma rather than on what surrounds it reads one as the other. When that happens the file does not fail; it comes out with half the cues, each running to the next one’s start. What actually separates them is the arrow, which SBV does not have.

What survives a conversion

Read this as a hierarchy. ASS is at the top and everything else is below it, so converting downwards loses whatever the lower format has no field for — and there is no way back up, because the information is gone rather than hidden.

  • ASS → SRT. Dialogue and timings survive. Styles, positions, colours, karaoke and drawings do not. Keep the original.
  • SRT ↔ VTT. Lossless in both directions, with one exception: WebVTT cue settings have no home in SubRip, so going VTT → SRT loses them.
  • SBV → SRT or VTT. Lossless. SBV holds strictly less than either.
  • Anything → ASS. Not honestly possible from a converter. Writing an ASS file means writing a script header and a style table, and inventing those is presenting a guess as data. Aegisub imports SubRip and gives you real styles instead.

Which to use

SubRip unless something specific says otherwise. It is the format every player, every editor and every broadcaster accepts, and its poverty is the reason: there is nothing in it to be incompatible about.

WebVTT for a web page, because the video element reads nothing else.

ASS only while you are doing the typesetting that needs it, and export SubRip for anyone who is not.

SBV never, going out. YouTube accepts SubRip and WebVTT on upload, so the only direction worth converting is out of it.

All of these are read from the content rather than the extension by the converter, which is the part that matters when a file has been renamed — and a renamed file is the single commonest reason a subtitle track shows nothing.

Questions

What is the difference between SRT and VTT?

WebVTT is the format the HTML video element reads. It requires a WEBVTT header, uses a full stop before the milliseconds, and allows styling and positioning. SubRip uses a comma, needs a sequential index above each cue, and carries nothing but text and timings.

Which subtitle format should I use?

SubRip if the file is going to a video editor, a player or a broadcaster — it is the one everything reads. WebVTT if it is going onto a web page. ASS only if you are doing typesetting that needs positioning and styling, and only for players that support it.

Is it safe to convert ASS to SRT?

The dialogue and timings survive intact. Everything else does not: fonts, colours, positions, karaoke timing and vector drawings have nowhere to go in SubRip. It is a one-way conversion, so keep the ASS file.

Why does my ASS file convert half a second early?

Because its timestamps end in centiseconds, not milliseconds. 0:00:05.50 is five and a half seconds, and a converter that reads those two digits as thousandths turns it into 5.05.

What is an SBV file?

The caption format YouTube uses in its own editor and caption download. Two timestamps separated by a comma, then the text, then a blank line — no header, no index numbers and no styling.

Tools from this guide

More subtitles tools — all of them running in your browser, none of them uploading a file.