fileformer
search⌘KtranslateENexpand_moreupload_fileConvert
Converters8 file families · 44 direct conversions
What changes in a conversionarrow_forward
home / video / srt · vtt

Subtitles are text files with a clock in them

An .srt is a number, a time range and a few lines of text, repeated, with a blank line between cues. It has no header, no stated encoding and no official spec, so players disagree about details. WebVTT (.vtt) is the browser’s stricter cousin. Open a subtitle file, or one of the two samples, to see its encoding, every cue on a timeline, reading-speed problems and how your browser’s own WebVTT parser reads it.

folder_openOpen .srt / .vttClean UTF-8 sampleWindows-1252 file with problems
rua-da-saudade.en.srt: UTF-8, LF, 12 cues with italics, a top-positioned sound cue and dialogue dashes
cue 1 as written · line 1SubRip
1counter: players mostly ignore it, but some refuse files where it’s missing or out of order
00:00:01,200 --> 00:00:03,400start --> end as hours:minutes:seconds,milliseconds = 2.200 s
<i>Lisbon, autumn.</i>1 line(s), 15 characters without tags → 6.8 characters per second
(blank line)ends the cue
encodingUTF-8Valid UTF-8, no BOM: what browsers and modern players assume.
read as UTF-8same textNo replacement characters.
line endingsLF ×42Consistent.
formatSubRip (SRT)No header: identified by its “-->” timing lines.

Every cue on the clock

12 cues · 00:00:37 · lower lane = overlapping cues
00:00:0000:00:0900:00:1800:00:2800:00:37
12cues
82%of the running time has text on screen
12.2average characters per second
22fastest cue (#5), CPS
141words per minute while on screen
1cues with a warning
cue · time · reading speed · checks12 cues
1
00:00:01,200 → 00:00:03,400 · 2.20 s · 6.8 CPSLisbon, autumn.
2
00:00:04,000 → 00:00:06,800 · 2.80 s · 15.0 CPSYou kept the key?Of course I kept the key.
3
00:00:07,100 → 00:00:09,000 · 1.90 s · 10.0 CPS[TRAM BELL RINGING]
ASS override {\an8}
4
00:00:09,300 → 00:00:12,600 · 3.30 s · 13.9 CPSIt still opens the blue dooron Rua da Saudade.
5
00:00:13,000 → 00:00:15,200 · 2.20 s · 22.3 CPS- Who lives there now?- Nobody. That’s the point.
22 CPS
6
00:00:15,800 → 00:00:18,900 · 3.10 s · 8.7 CPSThen why are we whispering?
7
00:00:19,400 → 00:00:22,000 · 2.60 s · 10.4 CPSBecause the walls remember.
8
00:00:22,600 → 00:00:25,300 · 2.70 s · 17.0 CPSCafé Brasileira at nine.Bring the photographs.
9
00:00:26,000 → 00:00:28,500 · 2.50 s · 4.8 CPSAll of them?
10
00:00:28,900 → 00:00:31,800 · 2.90 s · 13.4 CPSEspecially the onesyou said you burned.
11
00:00:32,400 → 00:00:34,000 · 1.60 s · 8.1 CPS[DOOR CREAKS]
12
00:00:34,600 → 00:00:37,900 · 3.30 s · 13.0 CPSPRIVATE, it says on the box.It always did.
00:00:00.000
Your browser’s own WebVTT parser read 12 cue(s) from the converted file, the same as this page. Press play: the captions above come from its cuechange events over a silent track.
check_circleNo overlaps.Each cue ends before the next one starts.
info1 cue(s) above 20 characters per second.Netflix’s limit for adult English; viewers stop reading and start skimming.
retiming lab · on the loaded file

Subtitles that drift are usually a frame-rate problem

A constant offset is easy to fix. Subtitles that start in sync and end seconds late were timed for a different playback speed. PAL releases run film 4.1% fast (23.976 → 25 fps), so a 2-hour film loses almost 5 minutes. Pick a preset, or say where the first and last cues should start: the page fits a straight line through both points and tells you which speed change it matches.

none25 → 23.976 (PAL to film)23.976 → 25 (film to PAL)24 → 23.97623.976 → 2425 → 2424 → 25
t′ = 1.000000 × t + 0 ms · last cue moves 0.00 s
cuebeforeaftermoved
100:00:01,20000:00:01,200+0.000 s
200:00:04,00000:00:04,000+0.000 s
300:00:07,10000:00:07,100+0.000 s
700:00:19,40000:00:19,400+0.000 s
1100:00:32,40000:00:32,400+0.000 s
1200:00:34,60000:00:34,600+0.000 s
SRT out · UTF-8 · numbered 1…ndownload .srt
100:00:01,200 --> 00:00:03,400<i>Lisbon, autumn.</i>200:00:04,000 --> 00:00:06,800You kept the key?Of course I kept the key.300:00:07,100 --> 00:00:09,000{\an8}[TRAM BELL RINGING]400:00:09,300 --> 00:00:12,600It still opens the blue dooron Rua da Saudade.500:00:13,000 --> 00:00:15,200- Who lives there now?- Nobody. That’s the point.600:00:15,800 --> 00:00:18,900Then why are we whispering?700:00:19,400 --> 00:00:22,000<i>Because the walls remember.</i>800:00:22,600 --> 00:00:25,300Café Brasileira at nine.Bring the photographs.900:00:26,000 --> 00:00:28,500All of them?1000:00:28,900 --> 00:00:31,800Especially the onesyou said you burned.1100:00:32,400 --> 00:00:34,000[DOOR CREAKS]1200:00:34,600 --> 00:00:37,900<b>PRIVATE</b> it says on the box.It always did.
WebVTT out · 1 {\an} → line/align settingsdownload .vtt
WEBVTT00:00:01.200 --> 00:00:03.400<i>Lisbon, autumn.</i>00:00:04.000 --> 00:00:06.800You kept the key?Of course I kept the key.00:00:07.100 --> 00:00:09.000 line:0[TRAM BELL RINGING]00:00:09.300 --> 00:00:12.600It still opens the blue dooron Rua da Saudade.00:00:13.000 --> 00:00:15.200- Who lives there now?- Nobody. That’s the point.00:00:15.800 --> 00:00:18.900Then why are we whispering?00:00:19.400 --> 00:00:22.000<i>Because the walls remember.</i>00:00:22.600 --> 00:00:25.300Café Brasileira at nine.Bring the photographs.00:00:26.000 --> 00:00:28.500All of them?00:00:28.900 --> 00:00:31.800Especially the onesyou said you burned.00:00:32.400 --> 00:00:34.000[DOOR CREAKS]00:00:34.600 --> 00:00:37.900<b>PRIVATE</b> it says on the box.It always did.

SRT next to WebVTT

aspectSRT (SubRip)WebVTT
signaturenone; recognised by its timing lines“WEBVTT” on the first line, optional text after
encodingnot specified: UTF-8, Windows-1252 and others all in the wildUTF-8 only
time format00:01:02,500 with a comma; hours required00:01:02.500 or 01:02.500, with a dot; hours optional
cue ida counter 1, 2, 3… expectedoptional, any text without “-->”
positioningnone officially; {\an8} from ASS is widely honouredcue settings: line, position, size, align, vertical, region
styling<i> <b> <u> and <font color>, by convention<i> <b> <u> <c.class> <v Speaker> <lang> <ruby>, CSS via ::cue and STYLE blocks
commentsnoneNOTE blocks
MIMEapplication/x-subrip (unregistered); often served as text/plaintext/vtt (registered)
in browsersnot supported by <track>the only format <track> loads
specnone; behaviour of the SubRip program and common playersW3C WebVTT (Candidate Recommendation, 2019)
other subtitle formats this page recognises
ASS / SSAstarts with [Script Info]: styles, karaoke, exact positioning; the anime fansub standard
TTML / DFXPXML with <tt>; basis of IMSC used by Netflix, broadcasters and streaming deliverables
SCCScenarist_SCC V1.0: hex CEA-608 caption bytes per timecode, for US broadcast
MicroDVD .sub{start frame}{end frame}text: times are frame numbers, so the frame rate is required
SBVYouTube’s 0:00:01.000,0:00:03.000 two-time format
EBU STLbinary teletext-era format from European broadcast
In MKV / MP4S_TEXT/UTF8 (SRT in Matroska), WebVTT in fMP4/HLS, tx3g in MP4
the numbers the checks use
20 CPSmax reading speed, adult English (Netflix Timed Text Style Guide); 17 for children
42 charsmax per line, English
2 linesmax per cue
5/6 sminimum duration (833 ms)
7 smaximum duration
2 framesminimum gap between cues (≈ 83 ms at 24 fps)
1990sSub Station AlphaSSA, then ASS, set the bar for styled fan subtitles.
2000SubRipA Windows OCR tool for DVD subtitles writes .srt; its plain output becomes the default.
2010TTML 1.0W3C’s XML timed text becomes a Recommendation.
2010WebSRT → WebVTTWHATWG drafts a web format based on SRT, soon renamed WebVTT.
2016IMSC 1TTML profile for streaming and broadcast delivery.
2019WebVTT CRWebVTT reaches W3C Candidate Recommendation.

Around subtitles