VocalFuse is a Fuse Intelligence product.

SUBTITLES · FORMATS · 2026

SRT vs VTT: pick by destination, not by hype

Both are plain-text files pairing lines of dialogue with start/end timecodes — open either in a text editor and you can read both. The difference is where each one is required: SRT is the universal interchange format every editor, player, and upload form accepts; VTT (WebVTT) is the only format the web actually understands. Conversion between them is lossless and takes one command — so the real skill is knowing which to reach for, and the handful of traps that make a correct-looking file silently fail.

The one-paragraph answer

Use SRT for YouTube, Vimeo, TikTok, Instagram, Facebook, every desktop video editor (Premiere, DaVinci Resolve, Final Cut Pro, CapCut), and every desktop player (VLC, mpv, Plex, Kodi). Use VTT the moment your video plays in a browser: the HTML5 <track> element only supports WebVTT, and an SRT referenced there shows nothing at all — no error, just absent captions. If a tool offers both and you are not sure where the file is going, SRT is the safer default; converting SRT → VTT later is a one-liner.

The formats are close cousins on purpose: WebVTT started life as “WebSRT,” forked from SubRip in 2010. That shared ancestry is why the differences fit in a short list — and why the differences that remain break things so quietly.

The same captions, in both formats

caption.srt

1
00:00:01,000 --> 00:00:04,500
Welcome to the demo.

2
00:00:05,200 --> 00:00:09,800
This cue has a sequence number
and a comma before milliseconds.

caption.vtt

WEBVTT

00:00:01.000 --> 00:00:04.500
Welcome to the demo.

00:00:05.200 --> 00:00:09.800
Same text, same timing —
a header and a period instead.

Every difference between the formats is visible in those two blocks, plus the features VTT adds on top:

Feature SRT VTT (WebVTT)
Header requiredNoneWEBVTT on line 1 — missing header = rejected outright
Timestamp separatorComma: 00:01:23,456Period: 00:01:23.456
Sequence numbersRequired (1, 2, 3…)Optional (stripped by most converters)
Hours in timestampsAlways writtenOptional when zero (01:23.000 is valid)
Positioning / alignmentNoYes — per-cue line:, position:, align:
StylingBasic <b>/<i> tags, player-dependentYes — CSS ::cue + STYLE blocks
Speaker labelsNoYes — <v Speaker> voice tags
Chapter markersNoYes — <track kind="chapters">
Comments / notesNoYes — NOTE blocks
HTML5 <track>Not supported — browser ignores it silentlyThe native, only-guaranteed format
Who reads itEvery editor, player, and upload form — the universal interchange formatBrowsers, HLS/DASH streams, web players (Video.js, Plyr, JW), Wistia/Brightcove; YouTube and Vimeo also accept it

Two more formats round out the practical field: iTT (iTunes Timed Text) is Apple’s XML delivery spec for the iTunes Store and Apple TV workflows; ASS/SSA is the anime-and-karaoke heavyweight with fonts, colors, and per-line positioning that smart TVs and Plex clients usually flatten. YouTube Studio’s caption export is SBV — convert it to SRT and it drops straight into an editor’s subtitle lane. Broadcast delivery is its own world (SCC, MCC, STL); if you are doing broadcast, you already know.

The silent-failure traps (the part that costs hours)

Neither format has a formal spec for SRT and both fail quietly in strict parsers. These are the six failures that account for nearly every “my subtitles don’t show” report:

  • The comma-vs-period trap. An HTML5 player fed SRT-style commas parses the file, hits the timestamp it cannot read, and skips those cues — or the whole track — with no error. One character, zero warnings.
  • The missing WEBVTT header. VTT files without WEBVTT on the first line are rejected outright. Hand-converted files miss this constantly.
  • Encoding. Notepad on older Windows defaults to ANSI (Windows-1252): accented characters become mojibake. Save UTF-8 — and without BOM: the invisible byte-order mark breaks cue 1 in some players, which is why Excel-exported “SRT” files lose their first caption.
  • The .txt extension. Notepad’s default “Text Documents” save type appends .txt behind your back — choose All Files and type the .srt extension explicitly.
  • Overlapping cues. SRT technically allows cue 2 to start before cue 1 ends; some players display glitches or drop one. YouTube-caption-to-VTT conversions hit this so often that converter scripts re-time each cue to start exactly where the previous one ends.
  • The web server double-tap. Browsers require a text/vtt MIME type: IIS returns 404 for .vtt until you add the MIME map, Apache needs AddType text/vtt .vtt. And a VTT served from a different origin than the page needs CORS headers plus crossorigin on the media element — a local file:// page gets origin-null blocks either way. Finally: a <track> without the default attribute loads but never displays.

Diagnosis rule: the file itself is almost never the problem — open it in a text editor and check the two lines that matter (header on line 1, the right decimal character). If the file looks right, the failure is in delivery: MIME type, CORS, or the track element’s attributes.

Converting between them: one command, lossless

Text and timing convert exactly — only the punctuation and header change. FFmpeg handles both directions, plus the two jobs people actually need conversion for:

# SRT -> VTT (adds WEBVTT header, flips commas to periods)
ffmpeg -i caption.srt caption.vtt

# VTT -> SRT (same command, reversed)
ffmpeg -i caption.vtt caption.srt

# burn subtitles into the video itself (every player, no caption file)
ffmpeg -i video.mp4 -vf subtitles=caption.srt -c:a copy out_burned.mp4

# embed as a soft, toggleable track in MKV (video/audio untouched)
ffmpeg -i video.mp4 -i caption.srt -c copy -c:s srt out.mkv

No ffmpeg? A VTT is close enough to SRT to hand-convert in any editor: add the WEBVTT header line, replace the comma before the milliseconds with a period, and (optionally) strip the sequence numbers. Going the other way, put the numbers back. For batches, Subtitle Edit (free, open source) converts and re-times overlapping cues in one pass.

One caution the first conversion teaches everyone: if the timing looks off by a constant amount across the whole file, the file is fine — the offset is in the export. Shift it once (Subtitle Edit’s synchronization tool) rather than re-timing cue by cue; if the drift grows over the video’s length, the file came from a different edit of the video and needs a re-export from the final cut.

Making an SRT in the first place

Three routes, ranked by how much of your life each one takes:

1. Write it by hand — fine for a few cues, and the fastest way to learn the format. Per cue: sequence number, timecode line with the comma (00:00:01,000 --> 00:00:04,500), one or two text lines under 42 characters, blank line. Save UTF-8 with the .srt extension.

2. Time it in a subtitle editor — Subtitle Edit or Aegisub (both free, open source) give you the audio waveform: import the video, set cue boundaries by ear, export SubRip. The honest middle path for short clips and translation work.

3. Generate it from the audio — the practical route for anything longer than a minute. AI transcription produces the timestamps in the same pass as the words; export SRT or VTT from the finished draft.

The truth nobody prints: a plain-text transcript cannot become an SRT — not by renaming, not by reformatting. SRT requires timing data plain text does not have. If your only transcript is untimed prose, go back to the source media: re-transcribe with a tool that keeps timing, or force-align the text you have (WhisperX or aeneas align an existing transcript to audio and emit timestamps). Renaming a .txt to .srt produces a file every player rejects.

Both formats, one pass, nothing uploaded

VocalFuse runs a Whisper-class speech engine locally on your Windows machine: drop in any audio or video file and get a timestamped, punctuated transcript with speaker labels — export it as TXT, SRT, or VTT from the same pass, so the format question becomes a download-menu choice rather than a conversion project. Nothing uploads: the engine runs on your PC, which is also why there is no per-minute meter (free tier, Basic $5/mo dictation, Pro $10/mo adds AI notes and summaries).

Because the timing comes from the audio itself, the exported SRT carries subtitle-grade cue timing with proper punctuation — the two things YouTube auto-captions fail at. Upload it to YouTube Studio’s caption editor, drop it into Premiere or DaVinci as a subtitle layer, or convert to VTT for your own site’s player — one transcript, every destination.

Related reading

Transcribe video files locally

Cloud tools vs the local Whisper pipeline, real cost per hour, and SRT/VTT export compared.

Video transcription guide

Timestamps: keep or strip

YouTube transcript timestamps, chapters, and the SRT you can re-upload to Studio.

Timestamps guide

Transcribe a YouTube video

Copy the caption track, yt-dlp the file, or run Whisper locally — commands included.

Three working methods

Podcast chapters & VTT markers

VTT chapter markers, podcast:chapters tags, and turning transcripts into navigation.

Podcast chapters guide

Explore related AI note taking guides

SRT vs VTT — FAQ

Which is better, SRT or VTT?

Neither is better in general — pick by destination. SRT is the universal interchange format: every video editor (Premiere, DaVinci, Final Cut, CapCut), every desktop player (VLC, mpv, Plex), and every platform upload form (YouTube, Vimeo, TikTok, Instagram, Facebook) accepts it. VTT is required for the web: the HTML5 <track> element only supports WebVTT, so a website or web player needs VTT. They convert losslessly in one command (ffmpeg -i caption.srt caption.vtt), so the choice is cheap to change later.

What is the actual difference between SRT and VTT?

SRT (SubRip) is the older, plainer format: a required sequence number, HH:MM:SS,mmm timestamps with a comma before the milliseconds, text, and a blank line — no header, no styling, no positioning. VTT (WebVTT) requires a WEBVTT header on line 1, uses a period instead of the comma (00:01:23.456), makes sequence numbers optional, and adds positioning/alignment, CSS styling, <v> speaker labels, chapter markers, and NOTE comments. The timing data underneath is identical.

Why do my subtitles not show up in my HTML5 video player?

Three checks, in order. First the file: an SRT in a <track> tag is ignored silently — browsers only render WebVTT, and a VTT missing the WEBVTT header is rejected outright. Second the server: browsers require the text/vtt MIME type (IIS returns 404 for .vtt until you add the MIME map; Apache needs AddType text/vtt .vtt). Third the element: a <track> without the default attribute loads but never displays, and a VTT served from another origin needs CORS headers plus a crossorigin attribute on the video element.

Can I convert an SRT file to VTT?

Yes, and it is lossless for text and timing — ffmpeg -i caption.srt caption.vtt adds the WEBVTT header and flips the comma before milliseconds to a period. Without ffmpeg: add the WEBVTT header line, replace commas with periods in the timestamps, and strip the sequence numbers (optional in VTT). The reverse conversion is the same command reversed. Batch converters like Subtitle Edit (free, open source) also re-time overlapping cues in the same pass.

How do I create an SRT file?

Three routes. Hand-write it for a few cues — sequence number, 00:00:01,000 --> 00:00:04,500 timecode line, one or two lines under 42 characters, blank line; save as UTF-8 with the .srt extension (Notepad: Save as type All Files, or Windows appends .txt). Time cues on a waveform in Subtitle Edit or Aegisub for short clips. Or generate the timestamps automatically by transcribing the audio with a speech engine and exporting SRT — the practical route for anything longer than a minute.

Can I convert a plain-text transcript to SRT by renaming it?

No — a .txt renamed to .srt is rejected by every player, because SRT requires timing data plain text does not have. If you have the original audio, re-transcribe with a tool that outputs timed formats, or force-align the text you have with WhisperX or aeneas (both free, command-line), which compute timestamps against the audio and emit a timed file. If the transcript has per-line timestamps you can parse, Subtitle Edit can import and rebuild valid SRT structure.

Why does my SRT file show garbage characters or lose its first cue?

Encoding. Mojibake (accented characters as é-style garbage) means the file was saved as ANSI/Windows-1252 — re-save as UTF-8. A missing first cue in some players is the UTF-8 BOM: the invisible byte-order mark prefix gets parsed as text and drops cue 1, a known behavior in older VLC builds and embedded devices. Save UTF-8 without BOM (VS Code and Notepad++ both let you toggle it; Excel and older Notepad often force it).

Does VocalFuse export SRT and VTT?

Yes — VocalFuse transcribes audio and video locally on Windows with a Whisper-class engine and exports TXT, SRT, and VTT from the same transcript, so you pick the format by destination at download time. Nothing uploads: the engine runs on your PC, which is why there is no per-minute meter. The free tier covers transcription; Basic ($5/mo) adds dictation and Pro ($10/mo) adds AI notes and summaries. Because timing comes from the audio itself, the SRT carries subtitle-grade cues with real punctuation.