← Back to Blog

SRT vs VTT vs SBV: Subtitle Formats Explained and How to Convert

February 18, 2026 · Subtitles

Try it now: Paste any YouTube URL and get subtitles free

Get Subtitles →

If you have ever downloaded subtitles from YouTube or any other video platform, you have probably encountered files ending in .srt, .vtt, or .sbv. All three formats store timed text β€” dialogue synchronised to specific moments in a video β€” but they differ in syntax, compatibility, and ideal use case. This article explains each format with concrete examples and shows you how to convert between them.

SRT (SubRip) Format

SRT is the most widely supported subtitle format. Nearly every video player, editing suite, and streaming platform accepts SRT files. The format is simple and human-readable:

1
00:00:01,000 --> 00:00:04,500
Hello and welcome to this tutorial.

2
00:00:05,000 --> 00:00:08,200
Today we will learn about subtitle formats.

3
00:00:09,000 --> 00:00:13,800
Let's start with the most popular one: SRT.

Key characteristics of SRT:

  • Each subtitle block has a sequential number, a timestamp line, and one or more lines of text.
  • Timestamps use the format HH:MM:SS,mmm β€” note the comma before milliseconds.
  • Blocks are separated by a blank line.
  • No header line is required.
  • Basic HTML-like tags (<b>, <i>, <u>) are supported by some players for bold, italic, and underline text.

VTT (WebVTT) Format

WebVTT (Web Video Text Tracks) was designed for the modern web. It is the native subtitle format for the HTML5 <track> element, making it the standard choice for embedding subtitles in web pages.

WEBVTT

1
00:00:01.000 --> 00:00:04.500
Hello and welcome to this tutorial.

2
00:00:05.000 --> 00:00:08.200
Today we will learn about subtitle formats.

3
00:00:09.000 --> 00:00:13.800
Let's start with WebVTT.

Key characteristics of VTT:

  • The file must begin with the line WEBVTT. This header is mandatory.
  • Timestamps use the format HH:MM:SS.mmm β€” note the dot before milliseconds (unlike SRT's comma).
  • Cue identifiers (the sequential numbers) are optional.
  • Supports CSS-based styling, positioning, and alignment cues that SRT does not.
  • Natively supported by all modern browsers (Chrome, Firefox, Safari, Edge).

SBV (SubViewer) Format

SBV is the format YouTube uses internally for uploaded subtitles. It is less common outside the YouTube ecosystem but is handy if you plan to upload captions back to YouTube.

0:00:01.000,0:00:04.500
Hello and welcome to this tutorial.

0:00:05.000,0:00:08.200
Today we will learn about subtitle formats.

0:00:09.000,0:00:13.800
Let's look at the SBV format.

Key characteristics of SBV:

  • No header line required.
  • No sequential numbering β€” each block is just a timestamp line followed by text.
  • The start and end timestamps are on the same line, separated by a comma.
  • Timestamps use the format H:MM:SS.mmm (hours may be a single digit).
  • Blocks are separated by a blank line.

Comparison Table

Feature SRT VTT SBV
Extension .srt .vtt .sbv
Timestamp format HH:MM:SS,mmm HH:MM:SS.mmm H:MM:SS.mmm
Header required No Yes (WEBVTT) No
Cue numbering Required Optional None
Styling support Basic HTML tags CSS styling & positioning None
Best for Video editing, VLC, universal use Web video (HTML5) YouTube upload

How to Convert Between Formats

The structural differences between SRT, VTT, and SBV are small, which makes conversion straightforward.

SRT to VTT

  1. Add WEBVTT as the first line of the file, followed by a blank line.
  2. Replace every comma in the timestamps with a dot (00:00:01,000 becomes 00:00:01.000).
  3. Optionally remove the cue numbers (VTT does not require them).

VTT to SRT

  1. Remove the WEBVTT header line.
  2. Replace every dot in the timestamps with a comma (00:00:01.000 becomes 00:00:01,000).
  3. Ensure every cue block has a sequential number.

Quick Python Conversion Script

Here is a minimal Python snippet that converts an SRT file to VTT:

def srt_to_vtt(srt_text: str) -> str:
    """Convert SRT subtitle text to WebVTT format."""
    # Replace comma with dot in timestamps
    vtt = srt_text.replace(",", ".")
    return "WEBVTT\n\n" + vtt.strip()


# Usage
with open("subtitles.srt", "r", encoding="utf-8") as f:
    srt_content = f.read()

vtt_content = srt_to_vtt(srt_content)

with open("subtitles.vtt", "w", encoding="utf-8") as f:
    f.write(vtt_content)

For the reverse direction (VTT to SRT), swap the replacement and strip the header:

def vtt_to_srt(vtt_text: str) -> str:
    """Convert WebVTT text to SRT format."""
    # Remove the WEBVTT header
    text = vtt_text.replace("WEBVTT\n\n", "").replace("WEBVTT\n", "")
    # Replace dot with comma in timestamps
    return text.replace(".", ",").strip()

Which Format Should You Use?

The right format depends on what you plan to do with the subtitles:

  • Web video (HTML5 player, custom website): Use VTT. It is the native format for the <track> element and supports advanced styling.
  • Video editing (Premiere Pro, DaVinci Resolve, Final Cut): Use SRT. It is universally supported by professional editing software and consumer players like VLC.
  • Uploading back to YouTube: Use SBV. YouTube's caption upload system handles SBV natively, though it also accepts SRT and VTT.
  • Reading or AI processing: Use TXT (plain text without timestamps). This gives the cleanest input for language models. Download TXT subtitles from SubtitlesYT.

Need to download subtitles in any of these formats? Check out our complete guide to downloading YouTube subtitles. If you work with videos in more than one language, see our article on downloading subtitles in multiple languages.

Ready to download subtitles? Paste a URL and get started.

Get Subtitles →