Skip to content
All guides

Subtitle Formats: SRT, WebVTT, ASS, and PGS

Why some subtitles are text and some are pictures, what that means for styling and searching, and why a file that works in VLC fails on a TV.

Subtitles seem like they should be the simplest part of a video pipeline. They're words with timestamps. In practice they're one of the most reliable sources of "works here, broken there" problems, because there are half a dozen formats in common use and they differ in a way that isn't obvious from the outside.

The fundamental split is between formats that carry text and formats that carry pictures. Almost everything else follows from that.

Text-Based Formats

SubRip is the lowest common denominator, and it earned that position by being trivially simple:

A number, a time range, the text, a blank line. That's the entire format. You can write a parser in twenty lines and edit a file in Notepad.

What it can't do is anything else. There's no official support for positioning, colour, or font. Some players honour a subset of HTML tags like <i> and <b>, but that's convention rather than specification, and a file relying on it will render inconsistently.

There's also no encoding declaration in the file, which causes the single most common subtitle bug: accented characters appearing as garbage because the player assumed the wrong encoding. Save as UTF-8 and most of it goes away, though some older hardware players still assume a regional codepage regardless.

For plain dialogue in a Latin-script language, SRT is fine and it works everywhere. That's its entire value proposition and it's a strong one.

The web standard, and the one to use for anything delivered over HTTP. It's what the HTML <track> element expects and what HLS and DASH carry.

It looks like SRT with the serial numbers filed off, plus real capability:

The differences that matter: a mandatory WEBVTT header, dots rather than commas for fractional seconds, and cue settings for positioning and alignment. It supports voice tags for identifying speakers, CSS styling through the page, and metadata cues that carry data rather than text, which is how some players implement chapter markers.

Crucially, encoding is defined as UTF-8. The ambiguity that plagues SRT doesn't exist here.

For segmented streaming, WebVTT files are cut into segments alongside the video and referenced as a separate rendition in the manifest, which lets the player load only the language the viewer selected.

Advanced SubStation Alpha, originally from the anime fansubbing community, and by a considerable margin the most capable text format.

It supports precise positioning, arbitrary fonts, colours, outlines, shadows, rotation, scaling, and animation. Karaoke timing is built in. Typesetters use it to place translated text over signs in the shot, matched to the perspective of the original.

The cost is complexity and support. ASS rendering requires a proper implementation, usually libass, and while VLC, mpv and most desktop players include it, smart TVs and streaming boxes frequently don't. A file that looks perfect on a laptop can render as unstyled text, or not at all, on a television.

Fonts are a particular problem. An ASS file references fonts by name and assumes they're installed. If they aren't, the renderer substitutes something else and the careful typesetting collapses.

Image-Based Formats

PGS (Presentation Graphic Stream) comes from Blu-ray. VobSub is its DVD predecessor. Both store subtitles as bitmap images with timing and position, rather than as text.

The reasoning was sound for physical media. An image renders identically everywhere, with no font dependency, no encoding question, and no risk of a player mangling a script it doesn't support. For a format that had to work identically on every player ever manufactured, that certainty was worth the cost.

The costs are substantial in a streaming context:

Size. Images are far larger than text. A full subtitle track can add tens of megabytes where SRT would add a few hundred kilobytes.

No searching or selecting. There's no text to search. Accessibility tools can't read it. You can't copy a line.

No resizing. The bitmap was rendered at a fixed resolution. Scaling it up on a 4K display looks soft, and the viewer can't increase the size for readability.

Transcoding cost. Converting to text requires OCR, which is slow and imperfect, particularly with unusual fonts or non-Latin scripts.

You'll encounter these mainly in files ripped from discs. If you're building a library, converting to SRT via OCR is usually worth doing once, accepting that you'll need to correct some errors.

Broadcast formats. DVB subtitles are image-based like PGS; teletext is text-based and extremely limited. Both appear in recordings from broadcast sources and in transport-stream captures. Neither is a sensible choice for anything new.

Closed Captions vs Subtitles

Worth separating, because the terms get used interchangeably and they aren't the same thing.

Subtitles assume you can hear the audio and need the dialogue in text, usually because it's in another language.

Closed captions assume you can't hear the audio. They include speaker identification, sound effects, and music cues. They're an accessibility feature with legal requirements attached in many jurisdictions.

Technically, broadcast closed captions (CEA-608 and CEA-708 in North America) are embedded in the video stream itself rather than carried as a separate track, which is why they survive being recorded and re-encoded when a separate subtitle track wouldn't.

Choosing One

For anything you're distributing, WebVTT. It's the standard, it handles encoding correctly, and every browser and streaming protocol supports it.

Things That Go Wrong

Timing drift. Subtitles that start in sync and gradually diverge indicate a framerate mismatch, usually a 23.976 file paired with subtitles timed for 25 fps or the reverse. A constant offset is easy to fix; drift needs the whole track rescaled.

Encoding garbage. Accents rendering as question marks or é means the file isn't UTF-8 or the player didn't detect that it is. Re-save as UTF-8.

Subtitles that won't turn on. Usually a naming problem for external files. Most players expect the subtitle file to share the video's filename, optionally with a language suffix: film.mkv and film.en.srt.

Styling ignored. An ASS file on a device without libass. Nothing to do but convert to SRT and accept the loss, or play it somewhere else.

Two tracks at once. An embedded track and an external file both enabled, overlapping on screen. Turn one off in the player's subtitle menu.