All Tools View Categories About Contact Privacy

Video Subtitle Extractor

Pull the subtitle tracks straight out of an MKV, MP4, WebM or MOV file and save them as SRT, VTT, ASS, TXT, JSON, CSV or LRC. Your file never leaves the browser.

Nothing is uploaded. The file is streamed locally through the File API in small slices, so even multi-gigabyte videos are parsed on your own machine.
Drop a video here, or click to choose
MKV, WebM, MP4, M4V, MOV, 3GP — up to any size
Scanning…
Use this if the extracted track runs early or late against your copy of the video.0 leaves durations untouched. Broadcast specs often use 1000.

No subtitle track inside the file means the captions are burned into the picture or were never there. In that case the video has to be transcribed from its audio instead.

About Video Subtitle Extractor

The Video Subtitle Extractor reads a video file directly in your browser, finds every text subtitle stream inside it, and writes those cues out as a clean subtitle file. Drop in an MKV, WebM, MP4, M4V or MOV and you get back SRT, WebVTT, ASS, plain text, JSON, CSV or LRC, with the original timings preserved to the millisecond.

Most videos that ship with subtitles keep them inside the container as a separate stream, alongside the video and audio. That is convenient for playback and awkward for everything else: you cannot edit them, translate them, feed them to a search index, or upload them to YouTube without first getting them out. The usual answer is to install ffmpeg and learn its stream-mapping syntax, or to upload a private video to a website you do not control. This tool is the third option, and it is the one most people actually want.

Under the hood it implements the container formats properly rather than guessing. For Matroska it walks the EBML tree - Segment, Info, Tracks, then each Cluster - reads the TimecodeScale, and decodes SimpleBlock and BlockGroup entries to recover each cue with its start time and duration. For MP4 and MOV it parses the ISO base media box structure down through moov, trak, mdia and stbl, rebuilds the sample table from stts, stsc, stsz and stco, then decodes tx3g or WebVTT samples. Track language and name come from the container metadata, so multi-language releases arrive properly labelled.

Everything runs locally. The file is streamed through the File API in 128 KB slices and never held in memory as a whole, so the size you can handle is not capped by available RAM. Only the subtitle bytes are decoded; video and audio payloads are stepped over. MP4 and MOV are the quicker of the two, because the sample table gives exact byte offsets, while Matroska requires one sequential pass over the file to walk its clusters. Either way the practical limit is disk read speed.

Features

  • Real container parsing: full EBML support for Matroska and WebM, and ISO-BMFF box parsing for MP4, M4V, MOV and 3GP. Timestamps come from the container itself, so they match what ffmpeg reports byte for byte.
  • Every text codec: reads SubRip, ASS, SSA, WebVTT and MP4 mov_text (tx3g) streams, including the ASS style header when one is present so exported .ass files keep their original styling.
  • Multi-track aware: a release with English, French and Japanese subtitles shows all three, labelled with language and track name from the container. Switch between them instantly, or use Download all tracks to save every one in a single click.
  • Seven export formats: SRT for near-universal compatibility, WebVTT for HTML5 video, ASS to preserve styling, TXT for transcripts and SEO copy, JSON and CSV for data pipelines and translation tools, and LRC for music players.
  • Formatting control: the Formatting tags selector converts ASS override codes to the <i> / <b> / <u> subset that SRT and VTT understand, keeps them untouched, or strips all markup for a clean transcript.
  • Timing repair built in: shift every cue by a millisecond offset, enforce a minimum display duration, trim overlapping cues so they never collide, and re-sort by start time - all applied live as you change the settings.
  • Streamed, not loaded: the file is read in small slices instead of being pulled into memory, so a Blu-ray remux is handled as comfortably as a two-minute clip and RAM is never the constraint.
  • Genuinely private: no upload, no queue, no account, and it keeps working with the network disconnected.

How to Use

  1. Add your video. Drag the file onto the drop zone or click it to open a file picker. MKV, WebM, MP4, M4V, MOV and 3GP are all accepted.
  2. Wait for the scan. The progress bar tracks the parse. Only container headers are read, so even very large files finish quickly.
  3. Pick a track. Every text subtitle stream is listed with its codec, language and cue count. Click one to load it; the panel on the right updates immediately.
  4. Choose your export format. Use SubRip (.srt) if you are unsure - it is accepted almost everywhere. Pick WebVTT for web players, ASS to keep styling, or JSON / CSV if the text is heading into another system.
  5. Tidy the output if needed. Set Formatting tags to strip markup for a plain transcript, enter a value in Shift all times by (ms, +/-) if the track runs early or late, and set a Minimum cue duration if you are working to a broadcast spec.
  6. Check the preview. The output box shows the finished file, with a cue count, total span and character count underneath so you can sanity-check before saving.
  7. Save it. Copy puts the text on your clipboard; Download writes a file named after the video and its language code; Download all tracks saves every language at once.

Examples

Example 1 - a multi-language MKV. A film release carries two SubRip tracks. Both are listed with their language tags, and picking the English one produces standard SRT:

Tracks found:
  SubRip - English - 1,284 cues
  SubRip - French  - 1,251 cues

Output (SubRip, English):
1
00:00:01,000 --> 00:00:04,000
Hello, world.
Second line here.

2
00:00:05,500 --> 00:00:08,250
This is a subtitle line.

Example 2 - an ASS track exported as SRT. Styled ASS dialogue carries override codes that SRT does not understand. With Formatting tags set to convert, they become the HTML subset SRT supports; set it to strip and you get a clean transcript instead:

In  (ASS):  {\i1}He never spoke of it again.{\i0}
convert:    <i>He never spoke of it again.</i>
strip:      He never spoke of it again.

Example 3 - a transcript for a blog post. Choose Plain text (.txt) with tags stripped and the timings disappear, leaving one line of dialogue per cue - ready to paste into an article, a summary prompt, or a search index.

Benefits

  • No ffmpeg required: gets the same result as ffmpeg -map 0:s:0 without installing anything or memorising stream-mapping syntax.
  • Safe with unreleased footage: because the video never leaves your machine, you can pull subtitles from an embargoed cut, a client project or anything else under NDA without it touching a third-party server.
  • Recovers work you already paid for: subtitles locked inside a delivered master become an editable file again, ready to translate, re-time or repurpose.
  • Feeds the rest of your pipeline: JSON and CSV exports drop straight into translation memory tools, subtitle QC scripts and analytics jobs, while TXT gives you an instant transcript for accessibility statements and SEO copy.
  • Handles archive material: multi-language releases, legacy mov_text tracks and old ASS fansub styling are all read correctly, so older libraries do not need special handling.
  • Works offline and without limits: no account, no queue, no per-file cap and no upload wait, so a batch of large files is a matter of minutes rather than hours.

Frequently Asked Questions

Which video formats are supported?
Matroska containers (MKV and WebM) and ISO-BMFF containers (MP4, M4V, MOV and 3GP). Between them these cover almost every modern video file. AVI, FLV and WMV are older container formats that very rarely carry text subtitle streams and are not supported.
Is my video uploaded to a server?
No. The file is read locally through the browser File API in one-megabyte slices, and only the subtitle bytes are decoded. Nothing is transmitted anywhere, and because the file is streamed in slices rather than loaded into memory, size is limited only by your patience for reading the file off disk.
Why does it say no subtitle track was found?
Three common reasons. The subtitles may be burned into the video picture, in which case there is no text to extract. They may be a separate .srt file sitting beside the video. Or they may be image-based subtitles such as PGS (Blu-ray) or VobSub (DVD), which are pictures of text and need OCR rather than decoding.
Which subtitle codecs can it read?
SubRip (S_TEXT/UTF8), ASS and SSA, WebVTT, and MP4 mov_text (tx3g). ASS override tags such as italic and bold can be converted to the HTML subset that SRT and WebVTT understand, kept as-is, or stripped entirely.
The timings are slightly off against my video. Why?
The tool reports the raw timestamps stored in the container, which is what you want in almost every case. Occasionally a file carries a start offset that a player compensates for during playback. The Shift all times by field lets you correct that in one step.
How fast is it on a large file?
The file is read once, sequentially, in 128 KB slices, and only the subtitle bytes are decoded - the video and audio payloads are skipped over rather than processed. In practice the limit is how fast your disk can stream the file, not the parsing, so a large remux takes roughly as long as copying it would.