Skip to content
← All Guides
🔒 No Upload Required ✅ Free Forever 🌐 Browser-Based
Video Tools

ASS to WebVTT: Subtitle Format Conversion Guide

By Bill Crawford  ·  March 2026  ·  10 min read

Connect on LinkedIn →

🎬 Ready to convert? Use the free browser-based ASS to VTT Converter — no upload, no signup.

Open Converter →

Table of Contents

  1. What Is the ASS Format?
  2. What Is the WebVTT Format?
  3. Why Convert ASS to WebVTT?
  4. What You Lose in Conversion
  5. Format Internals: ASS Parsing
  6. Timestamp Conversion Details
  7. Tag Mapping: Bold, Italic & More
  8. Using WebVTT in HTML5 Video
  9. Batch Conversion Workflows
  10. FAQ

If you are building a web video player or hosting video content online, you have almost certainly encountered the requirement for WebVTT subtitles. The problem is that many subtitle files come in ASS (Advanced SubStation Alpha) format — the standard for high-quality anime fansubs and styled caption tracks. ASS is powerful but not web-native; the browser's HTML5 <video> element does not support it directly.

WebVTT (Web Video Text Tracks) is the solution. It is the only subtitle format natively supported by all modern browsers via the <track> element, and it is accepted by virtually every streaming platform for caption uploads. This guide covers everything you need to know about converting ASS to WebVTT correctly.

What Is the ASS Format?

ASS stands for Advanced SubStation Alpha — an evolution of the older SSA format. An ASS file is structured plain text divided into sections:

The [Events] section begins with a Format: line that declares column order, followed by Dialogue: lines for each subtitle cue:

Dialogue: 0,0:01:02.34,0:01:05.12,Default,,0,0,0,,This is the subtitle text\Nwith a second line.

The timestamp format is H:MM:SS.cc where cc is centiseconds. Inline style tags are wrapped in curly braces: {\i1}italic{\i0}, {\b1}bold{\b0}, {\c&H0000FF&}blue text{\r}.

What Is the WebVTT Format?

WebVTT (Web Video Text Tracks, defined in the WHATWG WebVTT specification) is the subtitle standard for the web. Every valid WebVTT file must start with the string WEBVTT on the first line, followed by a blank line, then the cues:

WEBVTT

00:01:02.340 --> 00:01:05.120
This is the subtitle text
with a second line.

00:01:07.000 --> 00:01:09.500
Next subtitle here.

Key WebVTT characteristics:

Why Convert ASS to WebVTT?

The primary reason is web compatibility. WebVTT is the only subtitle format that works natively with HTML5 <video> via <track>. Platforms and use cases that require WebVTT:

What You Lose in Conversion

The dialogue text and timing are fully preserved. Here is what changes:

ASS FeatureIn WebVTT
Custom fonts and sizesRemoved — browser/player CSS controls appearance
Color styling ({\c&H...})Removed (VTT colors require CSS ::cue targeting)
Screen positioning ({\pos(x,y)})Removed — VTT uses its own cue settings syntax
Karaoke timing ({\k}, {\kf})Removed — syllable text preserved
Animated transforms ({\t(...)})Removed entirely
Drawing mode vector shapesRemoved entirely
Bold ({\b1}…{\b0})Mapped to <b>…</b> ✓
Italic ({\i1}…{\i0})Mapped to <i>…</i> ✓
\N and \n line breaksConverted to real newlines ✓
Dialogue text contentFully preserved ✓
Timing (start/end)Fully preserved in HH:MM:SS.mmm format ✓

Format Internals: How ASS Parsing Works

The most important rule when parsing ASS files is to read the Format: line rather than assuming a fixed column order. The typical column order is:

Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text

But non-standard files may use a different column order. The correct parsing approach:

  1. Locate the [Events] section
  2. Read the Format: line and build a column index map
  3. For each Dialogue: line, split on the first N-1 commas (where N = number of Format columns)
  4. The Text field (always last) may contain commas — the N-1 split rule handles this correctly

Example: "Yes, I agree, but that is not the point." — a naive split(',') would truncate this to "Yes". The correct approach preserves the entire sentence.

Timestamp Conversion Details

ASS timestamps use centiseconds as the fractional unit. WebVTT timestamps use milliseconds with a dot separator. The conversion:

ASS TimestampWebVTT TimestampNote
0:01:02.3400:01:02.340cc × 10 = ms; hours zero-padded
1:23:45.0701:23:45.070Single-digit centisecond → 070ms
0:00:00.0000:00:00.000Valid — starts at time zero
0:01:02.99900:01:02.999Three-digit fraction = already ms

Unlike SRT (which uses a comma: 00:01:02,340), WebVTT always uses a dot: 00:01:02.340. Using a comma in a VTT file is a parse error — browsers will reject the cue. This is one of the most common mistakes when manually creating VTT files.

WebVTT timestamps must always have two-digit zero-padded hours, even for short videos — 00:00:01.000 is valid; 0:00:01.000 is not. Some parsers accept single-digit hours but it is not spec-compliant.

Tag Mapping: Bold, Italic, and More

ASS inline style tags use a curly-brace syntax. WebVTT uses HTML-like angle-bracket tags. The converter maps these directly:

ASS TagWebVTT TagNotes
{\i1}…{\i0}<i>…</i>Italic — fully supported
{\b1}…{\b0}<b>…</b>Bold — fully supported
{\u1}…{\u0}<u>…</u>Underline — stripped (uncommon)
{\c&H...&}StrippedColor — use CSS ::cue in page styles
{\pos(x,y)}StrippedPosition — VTT uses cue settings instead
{\an1}…{\an9}StrippedAlignment — VTT uses align/position settings
All other {…}StrippedNo VTT equivalent

After tag mapping, any remaining curly-brace blocks are stripped entirely. The VTT output contains only valid WebVTT inline markup.

Using WebVTT in HTML5 Video

Once you have the .vtt file, adding it to an HTML5 video element is straightforward:

<video controls>
  <source src="movie.mp4" type="video/mp4">
  <track src="subtitles.vtt" kind="subtitles"
         srclang="en" label="English" default>
</video>

The kind attribute accepts: subtitles (translation), captions (dialogue + sound descriptions), descriptions (audio description), chapters (chapter markers), or metadata (non-display data). For most subtitle conversions, use subtitles or captions.

To style the cues via CSS:

::cue {
  font-size: 1.1em;
  color: white;
  background: rgba(0, 0, 0, 0.6);
  border-radius: 4px;
}
::cue(b) { font-weight: bold; color: #ffd700; }

Note: ::cue styling has limited cross-browser support — Chrome and Firefox support it; Safari support is partial. For production deployments, test across browsers.

Batch Conversion Workflows

For converting multiple files — a full season of a show, a documentary series, or an e-learning course — the batch approach saves significant time:

Frequently Asked Questions

My video player shows no subtitles after loading the VTT file. What went wrong?
The most common cause is a missing or malformed WEBVTT header. The first line of every VTT file must be exactly WEBVTT (optionally followed by a space and a description), then a blank line. Also check: (1) the file is served with MIME type text/vtt — some servers default to text/plain which browsers reject for <track> elements; (2) CORS headers if the video and VTT file are on different domains.
Can I use WebVTT with YouTube or Vimeo?
Yes. YouTube accepts VTT files via Creator Studio (Videos → Subtitles → Add → Upload File). Vimeo Pro and Business accounts accept VTT via the video settings subtitles tab. Both strip VTT-specific features and render the plain text with their own styling.
What is the MIME type for WebVTT files?
The correct MIME type is text/vtt. Web servers must be configured to serve .vtt files with this type or browsers will refuse to load them as subtitle tracks. In Apache: AddType text/vtt .vtt. In Nginx: add text/vtt vtt; to the types block.
Should I use WebVTT or SRT for web video?
For HTML5 video elements, always use WebVTT — it is the only format that works natively with <track>. For platform uploads (YouTube, Vimeo, social media), both are widely accepted, but VTT is preferred for web-native delivery. For device playback (smart TV, media player), SRT typically has broader support.
Can I go back from VTT to ASS?
Technically yes — tools like pysubs2 can wrap a VTT file in ASS structure. However, all original ASS styling is already gone. You would get a plain ASS file with default style and no positioning — functionally identical to the VTT content.

🎬 Convert your ASS subtitle files to WebVTT now — free, browser-based, no upload required.

Open ASS to VTT Converter →