SRT vs VTT vs SBV vs ASS: Complete Subtitle Format Comparison 2026
Choosing the right subtitle format can make the difference between seamless playback and broken rendering, professional styling and plain text, universal compatibility and platform lock-in. Whether you're building a video platform, managing a YouTube channel, or distributing content to streaming services, understanding subtitle format differences is crucial.
This comprehensive guide compares the four major subtitle formats—SRT, WebVTT, SBV, and ASS—covering their technical specifications, use cases, compatibility, and practical conversion strategies. By the end, you'll know exactly which format to use for your project.
Why Subtitle Format Choice Matters
Subtitle formats aren't just containers for text and timecodes—they determine:
- Playback compatibility: Some formats only work on specific platforms
- Styling capabilities: From plain text to pixel-perfect positioning
- File size: Impacts loading speed and storage costs
- Editing complexity: Affects workflow efficiency
- Accessibility compliance: Legal requirements in many regions
Let's dive into each format.
The Four Major Subtitle Formats
1. SRT (SubRip Subtitle) — The Universal Standard
Created: 2000
Extension: .srt
Mime Type: text/plain or application/x-subrip
Format Structure
SRT11 200:00:01,500 --> 00:00:04,200 3Welcome to subtitle format comparison. 4 52 600:00:04,300 --> 00:00:07,800 7SRT is the most widely supported format. 8 93 1000:00:08,000 --> 00:00:11,500 11It uses comma separators for milliseconds.
Key Characteristics
- Timecode format:
HH:MM:SS,mmm --> HH:MM:SS,mmm(comma separator) - Styling: Basic HTML tags (
<i>,<b>,<u>) only - Positioning: None
- Metadata: None
- Encoding: UTF-8 recommended (but often breaks with legacy encodings)
Pros
✅ Universal compatibility: Works on 99% of video players ✅ Simple structure: Easy to parse and edit manually ✅ Small file size: Plain text, minimal overhead ✅ Human-readable: Can be edited in any text editor ✅ YouTube/Vimeo native support: Upload directly without conversion
Cons
❌ No advanced styling: Can't control font, color, or position ❌ No metadata: No language tags, captions vs subtitles distinction ❌ Encoding issues: UTF-8 not enforced, leads to broken characters ❌ Limited accessibility: No semantic tags for sound effects vs dialogue
When to Use SRT
- Video hosting platforms: YouTube, Vimeo, Wistia default format
- Maximum compatibility: Distributing to unknown players
- Simple content: No styling needs beyond basic italics/bold
- Translation workflows: Easiest format for translators to work with
2. WebVTT (Web Video Text Tracks) — The Web Standard
Created: 2010 (W3C Standard)
Extension: .vtt
Mime Type: text/vtt
Format Structure
VTT1WEBVTT 2 3NOTE This is a WebVTT file with styling 4 5STYLE 6::cue { 7 background-color: rgba(0,0,0,0.8); 8 color: white; 9 font-family: sans-serif; 10} 11 1200:00:01.500 --> 00:00:04.200 13Welcome to WebVTT format. 14 1500:00:04.300 --> 00:00:07.800 16<v Speaker1>WebVTT supports voice tags. 17 1800:00:08.000 --> 00:00:11.500 align:start position:10% 19It uses periods for milliseconds.
Key Characteristics
- Timecode format:
HH:MM:SS.mmm --> HH:MM:SS.mmm(period separator) - Header required: Must start with
WEBVTT - Styling: Full CSS via
STYLEblocks and inline cue settings - Positioning: Precise control with
align:,position:,line:,size: - Metadata:
NOTEblocks,KINDattribute (captions vs subtitles) - Voice tags:
<v Name>Text</v>for speaker identification
Pros
✅ W3C standard: Native HTML5 <track> element support
✅ Advanced styling: Full CSS control over appearance
✅ Semantic metadata: Distinguish captions, subtitles, descriptions
✅ Positioning: Pixel-perfect placement for on-screen text
✅ Accessibility: Best support for screen readers and accessibility features
Cons
❌ Not universal: Older video players don't support it ❌ More complex: Requires understanding of cue settings ❌ Larger file size: Styling blocks add overhead ❌ YouTube conversion: YouTube converts VTT to SRT internally
When to Use WebVTT
- HTML5 video players: Modern web applications
- Accessibility compliance: Legal requirements (ADA, WCAG 2.1)
- Custom styling: Brand-specific subtitle appearance
- Multiple tracks: Captions, subtitles, audio descriptions in one file
- Live streaming: HLS and DASH protocols use VTT
3. SBV (SubViewer) — The YouTube Format
Created: 2005 (adopted by YouTube 2010)
Extension: .sbv
Mime Type: text/plain
Format Structure
SBV10:00:01.500,0:00:04.200 2Welcome to SBV format. 3 40:00:04.300,0:00:07.800 5This is YouTube's preferred format. 6 70:00:08.000,0:00:11.500 8Notice the single-line timecode format.
Key Characteristics
- Timecode format:
H:MM:SS.mmm,H:MM:SS.mmm(no leading zeros on hours) - No sequence numbers: Just timecode and text
- Single line timecodes: Start and end on one line separated by comma
- No styling: Not even basic HTML tags
- Minimal structure: Blank lines separate subtitle blocks
Pros
✅ YouTube native: Fastest upload/processing on YouTube ✅ Simplest format: Even easier than SRT to parse ✅ Small file size: Minimal overhead ✅ No numbering errors: Can't mess up sequence numbers
Cons
❌ YouTube only: Limited platform support ❌ No styling: Not even italics or bold ❌ No metadata: Can't specify language or type ❌ Hours ambiguity: Leading zero optional (inconsistent parsing)
When to Use SBV
- YouTube content: If you're exclusively uploading to YouTube
- Auto-generated subtitles: YouTube's API returns SBV format
- Maximum simplicity: When you want the least complexity
4. ASS/SSA (Advanced SubStation Alpha) — The Anime Standard
Created: 1998 (SSA), 2001 (ASS advanced version)
Extension: .ass or .ssa
Mime Type: text/x-ass
Format Structure
ASS1[Script Info] 2Title: My Anime Subtitles 3ScriptType: v4.00+ 4Collisions: Normal 5PlayDepth: 0 6 7[V4+ Styles] 8Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding 9Style: Default,Arial,20,&H00FFFFFF,&H000088EF,&H00000000,&H80000000,-1,0,0,0,100,100,0,0,1,2,0,2,10,10,10,1 10 11[Events] 12Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text 13Dialogue: 0,0:00:01.50,0:00:04.20,Default,,0,0,0,,Welcome to ASS format! 14Dialogue: 0,0:00:04.30,0:00:07.80,Default,,0,0,0,,{\c&H00FFFF&}This text is cyan! 15Dialogue: 0,0:00:08.00,0:00:11.50,Default,,0,0,0,,{\pos(640,500)}Positioned exactly at these coordinates.
Key Characteristics
- Timecode format:
H:MM:SS.cc(centiseconds, not milliseconds!) - Style definitions: Comprehensive styling system with named styles
- Override tags: Inline
{\tag}for per-word styling - Positioning: Pixel-perfect
\pos(x,y),\move(x1,y1,x2,y2) - Effects: Karaoke timing (
\k), animations, rotations - Layers: Multiple subtitle layers for overlays
Pros
✅ Maximum control: Pixel-perfect styling and positioning ✅ Animation support: Movement, fades, karaoke effects ✅ Professional quality: Used in broadcast anime and fansubs ✅ Complex formatting: Multiple fonts/colors in one subtitle ✅ Reusable styles: Define once, apply to all subtitles
Cons
❌ Complexity: Steep learning tool, not hand-editable ❌ Limited compatibility: Mainly VLC, MPC-HC, mpv, Plex ❌ Large file size: Style definitions add significant overhead ❌ Web incompatible: No browser support, requires conversion ❌ Overkill: 99% of use cases don't need this power
When to Use ASS
- Anime fansubs: Industry standard for fan translations
- Karaoke videos: Timing effects for sing-alongs
- Professional production: Broadcast-quality styling requirements
- Artistic subtitles: Creative positioning and effects
- Video overlay graphics: Signs, on-screen text translation
Format Comparison Table
| Feature | SRT | WebVTT | SBV | ASS |
|---|---|---|---|---|
| Timecode separator | Comma (,) | Period (.) | Period (.) | Period (.) |
| Timecode precision | Milliseconds | Milliseconds | Milliseconds | Centiseconds |
| Hour format | Always 2 digits | Always 2 digits | Variable | Variable |
| Sequence numbers | Required | Optional | None | None |
| Basic styling | HTML tags | HTML + CSS | None | Full control |
| Positioning | None | Cue settings | None | Pixel-perfect |
| Metadata | None | NOTE blocks | None | Script Info |
| Voice tags | Manual (dashes) | <v> tags | None | Name field |
| File size (1000 lines) | ~50 KB | ~80 KB | ~45 KB | ~150 KB |
| Hand-editable | ✅ Easy | ⚠️ Moderate | ✅ Easy | ❌ Difficult |
| YouTube support | ✅ Yes | ✅ Converted | ✅ Native | ❌ No |
| Vimeo support | ✅ Yes | ✅ Yes | ❌ No | ❌ No |
HTML5 <track> | ⚠️ Limited | ✅ Full | ❌ No | ❌ No |
| VLC player | ✅ Yes | ✅ Yes | ✅ Yes | ✅ Yes |
| Accessibility | ⚠️ Basic | ✅ Excellent | ❌ Poor | ⚠️ Moderate |
| Browser support | ⚠️ Via parsing | ✅ Native | ❌ No | ❌ No |
| Learning curve | Easy | Moderate | Easy | Difficult |
| Best for | Universal | Web/A11y | YouTube | Anime/Pro |
Deep Dive: Timecode Format Differences
This is the #1 source of conversion errors. Let's break it down:
SRT Timecode Format
00:00:01,500 --> 00:00:04,200
HH:MM:SS,mmm --> HH:MM:SS,mmm
^^ ^ ^
Always 2 Comma Arrow with spaces
digits separator
WebVTT Timecode Format
00:00:01.500 --> 00:00:04.200
HH:MM:SS.mmm --> HH:MM:SS.mmm
^^ ^ ^
Always 2 Period Arrow with spaces
digits separator
SBV Timecode Format
0:00:01.500,0:00:04.200
H:MM:SS.mmm,H:MM:SS.mmm
^ ^ ^
Variable Period Comma separator
hours separator (NO arrow)
ASS Timecode Format
0:00:01.50,0:00:04.20
H:MM:SS.cc,H:MM:SS.cc
^ ^ ^
Variable Period Centiseconds
hours separator (NOT milliseconds!)
Critical conversion note: ASS uses centiseconds (1/100 second), not milliseconds (1/1000 second). When converting from SRT/VTT/SBV to ASS, you must divide milliseconds by 10:
SRT: 00:00:01,500 (1 second + 500 milliseconds)
ASS: 0:00:01.50 (1 second + 50 centiseconds)
Styling Capabilities Comparison
SRT: Basic HTML Tags Only
SRT1 00:00:01,000 --> 00:00:03,000 <i>Italics</i> and <b>bold</b> and <u>underline</u>
Supported tags: <i>, <b>, <u>, <font color="..."> (player-dependent)
No support for: Font family, size, position, background color
WebVTT: Full CSS Control
VTT1STYLE 2::cue { 3 font-family: 'Arial', sans-serif; 4 font-size: 18px; 5 color: white; 6 background-color: rgba(0,0,0,0.8); 7 text-shadow: 2px 2px 4px #000; 8} 9 10::cue(b) { 11 color: #FFD700; 12 font-weight: bold; 13} 14 1500:00:01.000 --> 00:00:03.000 align:center position:50% line:90% 16This subtitle is <b>styled with CSS</b>!
Positioning attributes:
align:start|center|end- Horizontal alignmentposition:X%- Horizontal position (0-100%)line:X%- Vertical position (0-100%)size:X%- Width of subtitle box
ASS: Pixel-Perfect Control
ASSDialogue: 0,0:00:01.00,0:00:03.00,Default,,0,0,0,,{\c&H00FFFF&\fs24\b1}Cyan 24pt bold text Dialogue: 0,0:00:03.00,0:00:05.00,Default,,0,0,0,,{\pos(640,500)}Positioned at x=640, y=500 Dialogue: 0,0:00:05.00,0:00:07.00,Default,,0,0,0,,{\move(100,500,1820,500,0,2000)}Scrolling text!
Override tags (partial list):
\c&HBBGGRR&- Primary color (hex, BGR format!)\fs##- Font size\b1/\b0- Bold on/off\i1/\i0- Italic on/off\pos(x,y)- Absolute position\move(x1,y1,x2,y2)- Animated movement\fad(in,out)- Fade in/out (milliseconds)\t(start,end,\tag)- Transform over time
Platform Compatibility Matrix
| Platform | SRT | WebVTT | SBV | ASS |
|---|---|---|---|---|
| YouTube | ✅ Native | ✅ Converted | ✅ Native | ❌ Not supported |
| Vimeo | ✅ Native | ✅ Native | ❌ Convert | ❌ Not supported |
| Wistia | ✅ Native | ✅ Native | ❌ Convert | ❌ Not supported |
| ✅ Yes (as SRT) | ❌ Convert | ❌ Convert | ❌ Not supported | |
HTML5 <video> | ⚠️ Polyfill | ✅ Native | ❌ Polyfill | ❌ Not supported |
| VLC Player | ✅ Full support | ✅ Full support | ✅ Full support | ✅ Full support |
| MPC-HC | ✅ Full support | ✅ Full support | ✅ Full support | ✅ Full support |
| Plex | ✅ Full support | ✅ Full support | ⚠️ Limited | ✅ Full support |
| Kodi | ✅ Full support | ✅ Full support | ✅ Full support | ✅ Full support |
| Apple TV | ✅ Full support | ✅ Full support | ❌ Convert | ❌ Not supported |
| Android TV | ✅ Full support | ✅ Full support | ⚠️ Limited | ⚠️ Limited |
| Roku | ✅ Full support | ✅ Full support | ❌ Convert | ❌ Not supported |
| AWS MediaConvert | ✅ Input/Output | ✅ Output | ❌ Convert | ❌ Not supported |
| FFmpeg | ✅ Full support | ✅ Full support | ✅ Full support | ✅ Full support |
Legend:
- ✅ Native support, no conversion needed
- ⚠️ Limited support, may lose features
- ❌ Not supported, must convert first
When to Use Each Format: Decision Tree
START: What's your use case?
│
├─ Uploading to YouTube?
│ ├─ Only YouTube? → SBV
│ └─ Multi-platform? → SRT
│
├─ Building a web application?
│ ├─ Need accessibility compliance? → WebVTT
│ ├─ Need custom styling? → WebVTT
│ └─ Basic playback only? → SRT
│
├─ Anime fansubbing or karaoke?
│ └─ → ASS
│
├─ Maximum compatibility (unknown players)?
│ └─ → SRT
│
├─ Professional broadcast?
│ ├─ Web delivery? → WebVTT
│ ├─ Styled delivery? → ASS
│ └─ Universal delivery? → SRT
│
└─ Translation workflow?
└─ → SRT (easiest for translators)
How to Convert Between Formats
Method 1: Online Converter (IntlPull)
Use IntlPull's free subtitle converter:
- Upload your subtitle file (any format)
- Select target format
- Download converted file
What gets preserved:
- Timecodes (automatically adjusted for format differences)
- Text content
- Basic styling (if target format supports it)
What gets lost:
- Advanced styling when converting to simpler formats (ASS → SRT loses colors/positioning)
- Metadata (notes, script info)
Method 2: Command-Line (FFmpeg)
FFmpeg supports all four formats:
Terminal1# SRT to WebVTT 2ffmpeg -i input.srt output.vtt 3 4# WebVTT to SRT 5ffmpeg -i input.vtt output.srt 6 7# SRT to ASS (with default styling) 8ffmpeg -i input.srt output.ass 9 10# ASS to SRT (loses all styling) 11ffmpeg -i input.ass output.srt 12 13# SBV to SRT 14ffmpeg -i input.sbv output.srt
Pro tip: When converting from ASS to SRT/VTT, FFmpeg strips all styling. To preserve some formatting, manually adjust before conversion.
Method 3: Programmatic (Python Example)
Python1import pysubs2 2 3# Load subtitle file (auto-detects format) 4subs = pysubs2.load("input.srt") 5 6# Modify if needed 7for line in subs: 8 line.text = line.text.upper() # Example: uppercase all text 9 10# Save as different format 11subs.save("output.vtt") # Saves as WebVTT 12subs.save("output.ass") # Saves as ASS 13subs.save("output.sbv") # Saves as SBV
Library supports: SRT, WebVTT, ASS/SSA, MicroDVD, MPL2, TMP, Sub
Real-World Format Selection Examples
Example 1: YouTube Educational Channel
Scenario: Tutorial videos in English, expanding to Spanish and French
Recommendation: SRT
Why:
- YouTube native support
- Easy for translators to work with
- No styling needs (YouTube's player handles display)
- Maximum compatibility if you later embed videos elsewhere
Example 2: SaaS Product Demo on Website
Scenario: Marketing video with branded styling on landing page
Recommendation: WebVTT
Why:
- HTML5
<track>native support - Custom CSS for brand colors and fonts
- Accessibility compliance for WCAG 2.1
- Can position subtitles below UI elements
Example 3: Anime Fansub Community
Scenario: Translating and styling anime with creative typography
Recommendation: ASS
Why:
- Industry standard for fansubs
- Pixel-perfect positioning for on-screen sign translation
- Color coding for different speakers
- Karaoke timing for opening/ending songs
Example 4: Corporate Training Platform
Scenario: Internal videos with multiple language tracks
Recommendation: SRT for production, WebVTT for web player
Why:
- Translators work with SRT (easiest format)
- Convert to WebVTT for web player deployment
- SRT source files for archival and future platform changes
File Encoding: The Hidden Compatibility Killer
All formats support Unicode, but encoding errors are the #1 cause of broken subtitles:
Common Issues
Problem: Characters display as "é" instead of "é" Cause: File saved as ISO-8859-1 but read as UTF-8
Problem: Chinese/Japanese characters show as "??????" Cause: File saved without BOM (Byte Order Mark) on Windows
Problem: Apostrophes show as "’" Cause: Smart quotes encoded in Windows-1252 but read as UTF-8
Solution: Always Use UTF-8
When creating or editing subtitle files:
Terminal1# Check current encoding 2file -bi input.srt 3 4# Convert to UTF-8 5iconv -f ISO-8859-1 -t UTF-8 input.srt -o output.srt 6 7# Or use dos2unix for line ending conversion + UTF-8 8dos2unix -n input.srt output.srt
Text editor settings:
- VS Code: Bottom-right encoding selector → "Save with Encoding" → UTF-8
- Sublime Text: File → Save with Encoding → UTF-8
- Notepad++: Encoding → Convert to UTF-8
Web uploads: Most platforms (YouTube, Vimeo) auto-detect encoding, but you'll avoid issues by standardizing on UTF-8 from the start.
Subtitle Format Future: What's Coming?
TTML (Timed Text Markup Language)
W3C standard used in broadcast and streaming (Netflix, Amazon Prime). XML-based, more complex than WebVTT but with similar capabilities.
Status: Used by enterprises, not casual creators.
IMSC (TTML Profile for Internet Media Subtitles)
Simplified TTML profile gaining traction in OTT streaming.
Status: Emerging standard, limited tooling.
WebVTT v2
Proposed additions to WebVTT standard:
- Region styling (non-rectangular subtitle areas)
- Animation improvements
- Better accessibility metadata
Status: In draft, may arrive 2027-2028.
Frequently Asked Questions
Can I use SRT on my website?
Technically yes, but you'll need JavaScript to parse and render it (HTML5 <track> expects WebVTT). Better to convert SRT → WebVTT.
Why does YouTube convert my WebVTT to SRT?
YouTube's internal processing uses SRT. They convert uploaded WebVTT files and strip advanced styling for consistency across devices.
Can I edit ASS files by hand?
Possible but painful. Use subtitle editing software like Aegisub (free, open-source, designed for ASS).
Do I need different subtitle files for mobile vs desktop?
No. Modern players adapt subtitle rendering to screen size. Just ensure your text length follows CPS (characters per second) guidelines.
What's the best format for Netflix/Disney+?
They use proprietary formats (TTML/IMSC). If you're delivering to them, they'll provide specifications and conversion tools.
Conclusion
For 90% of use cases: Start with SRT for maximum compatibility and translator-friendliness. Convert to WebVTT if you need web-native features or accessibility compliance. Only use ASS if you need professional styling or are working in the anime community. SBV is only worth using if you're exclusively on YouTube.
Quick reference:
- Universal compatibility → SRT
- Web applications → WebVTT
- YouTube exclusive → SBV
- Creative styling → ASS
Convert for free at IntlPull Subtitle Converter.
Related Tools:
- Translate SRT Subtitles Guide
- Generate Subtitles from Audio with Whisper AI
- Free Subtitle Format Converter
For teams managing subtitle workflows at scale, explore IntlPull's TMS platform with translation memory, multi-format support, and automated conversions.
