The codec list that decides which tracks you can tick
Not every subtitle track is made of words. That single fact is the reason this page exists in the shape it does.
Six codec names are treated as convertible: SubRip (what most MKV rips carry), ASS and SSA (the styled format anime releases use), MOV text (the usual MP4 answer) and WebVTT, plus ffmpeg’s generic plain text. Each of those stores actual characters with timings, so writing them out as an SRT or VTT file is a re-serialisation rather than a conversion.
Four are explicitly classified as image-based and locked: PGS, the Blu-ray format; VobSub, the DVD one; DVB subtitles from broadcast captures; and XSub. Every caption in these is a tiny picture of rendered type. There is no text in there to extract, and pointing a text encoder at one produces either an opaque failure or a plausible-looking empty file, which is worse.
Anything else, meaning any codec name that appears in neither list, is also locked. That is the deliberately cautious default. Offering an unverified codec as extractable risks handing you garbage that looks like a result, and a greyed-out row with a visible codec name is a far more useful answer than a broken download.
Probing first, because the track list cannot exist until the file is read
A page whose settings are declared up front can show them to you before you have chosen anything, because they never change. This one cannot. The choices here are the tracks inside your particular video, and nothing knows what those are until something has actually read the container.
So the flow is inverted. Choosing a file triggers a metadata-only pass that decodes nothing and produces no output file, purely to capture the stream listing. That listing is parsed for subtitle lines, and each one yields a stream index, a codec name, a language tag when present, a title when the track declares one, and the default and forced disposition flags. Only then does the picker appear.
- Use the Upload a video to list its subtitle tracks control to choose an MKV, MP4, MOV, M4V or WEBM file. The engine loads and probes it, and the page says it is reading subtitle tracks while it works.
- Read the list. Each row shows the language, the codec name exactly as the engine reports it, the track title in quotes when there is one, and small badges for default and forced tracks. Text tracks arrive pre-ticked; unusable ones are ticked off, disabled, and carry a badge marking them as not extractable.
- Choose SRT or VTT as the output format.
- Press the Extract button, which counts the ticked tracks in its own label, then download each resulting file.
The extraction command maps a single stream out of the container and sends it to a text encoder, so no video or audio is written anywhere in the output. The SRT and VTT paths are two genuinely different encoders rather than one encoder with a different file extension, which matters because getting that wrong yields one format’s cue syntax inside the other’s file.
Languages are read from the tag, never inferred
The three-letter code beside each track is whatever the file itself declares, translated through a lookup of the codes that actually turn up in real rips. A few dozen are recognised by name; a code outside that set is shown as the raw code in capitals rather than being guessed at, and a track that carries no tag or declares itself undetermined is shown as an unknown language.
This is worth knowing because rips lie. A track tagged eng can perfectly well be a forced-subtitle track containing nothing but the alien dialogue, and a track with no tag at all can be the full English dub captions. The forced badge and the track title, when a release group bothered to set them, tell you more than the language code does. When in doubt, extract two candidates and open them.
The real cost of running a media engine over a multi-gigabyte MKV
The engine is ffmpeg compiled to WebAssembly, in its single-threaded build, loaded from a CDN the first time you use it. Single-threaded is not an oversight: the multi-threaded build demands isolation headers that would break the ad frames this site is built around, so every media page here accepts the slower core as the price.
For subtitle work the encoding itself is trivial, since a track of cue text is a vanishing fraction of a video container’s bytes. The cost is elsewhere: your video has to be copied into the engine’s in-memory filesystem before each command, and there is more than one command. The picker probes once, the extraction re-probes before it trusts the picker’s state, and then each ticked track is its own pass. Extract two tracks and your video is written into that filesystem four times across the run.
That is the ceiling to plan around, and it is memory rather than any imposed limit. A short clip goes through without you noticing; a large remux on a phone may not finish at all. Where a run does fail, this page shows you the underlying error message rather than the single generic sentence the shared shells fall back to, which is unusual on this site and a real help when a container turns out to be awkward.
Where the extracted file goes next
An SRT in hand is the start of a chain rather than the end of one. If the timings drift against your copy of the video, Shift Subtitle Timing moves every timestamp by a fixed offset and can also stretch them for a frame-rate mismatch. If you need the other text format, Convert SRT to VTT works in both directions and takes a batch of files at once, picking its direction from each file’s extension. For real editing, retiming a line at a time against playback, Subtitle Editor gives you a cue table beside the video.
Burning captions permanently into the picture is a different page again, and one worth checking the input list on: Add Subtitles to Video takes MP4, MOV, M4V and WebM alongside your SRT or VTT, but not MKV, so an MKV rip needs Convert MKV to MP4 first. The rest of the video utilities live on the video hub.