Learn through the super-clean Baeldung Pro experience:
>> Membership and Baeldung Pro.
No ads, dark-mode and 6 months free of IntelliJ Idea Ultimate to start with.
Last updated: February 6, 2024
Matroska, commonly known as an MKV file, is a multimedia format that encapsulates audio, video, and subtitle files into a complete movie file.
In this tutorial, we’ll see how to extract the subtitle file(s) from an MKV file.
All commands in this guide have been tested on Debian 12 running MKVToolNix 74.0.0 and FFmpeg 5.1.4.
Let’s use the sample file (11MB) from the Matroska website. Matroska is a container. Therefore, the sample file consists of:
Since the file is a video file, the file extension is .mkv. However, Matroska actually has various file types based on its use. For example:
In the next sections, we’ll explore how to locate the subtitles in an MKV file and extract them.
MKVToolNix is a package containing a set of command-line tools to inspect, edit, and create Matroska files.
As a result, the package includes four binaries:
We’ll use the mkvinfo and mkvextract commands to get the subtitle track number and extract the subtitle, respectively.
The MKVToolNix package is available on the Debian official repository under its canonical name, mkvtoolnix:
$ apt search mkvtoolnix
Sorting... Done
Full Text Search... Done
mkvtoolnix/stable,now 74.0.0-1 amd64
Set of command-line tools to work with Matroska files
mkvtoolnix-gui/stable,now 74.0.0-1 amd64
Set of tools to work with Matroska files - GUI frontend
We can install either the text mode or the GUI mode. The GUI mode is a program that, in turn, also automatically installs the text mode.
Let’s install the text mode:
$ sudo apt install mkvtoolnix
$ mkvinfo --version
mkvinfo v74.0.0 ('You Oughta Know') 64-bit
Once the installation is finished, we should be able to check the software version using one of the tools, such as mkvinfo.
An MKV file may contain multiple files, each identified by a track number.
Let’s view them using mkvinfo:
$ mkvinfo vsshort-vorbis-subs.mkv
...
|+ Tracks
| + Track
| + Track number: 1 (track ID for mkvmerge & mkvextract: 0)
| + Track type: video
...
| + Track
| + Track number: 2 (track ID for mkvmerge & mkvextract: 1)
| + Track type: audio
...
| + Track
| + Track number: 3 (track ID for mkvmerge & mkvextract: 2)
| + Track type: subtitles
...
| + Track
| + Track number: 4 (track ID for mkvmerge & mkvextract: 3)
| + Track type: subtitles
...
We need to know the position or the track number of the subtitle before extracting it. Hence, referring to the output above, we see that the subtitle track numbers are 3 (English) and 4 (German).
However, the track IDs for the mkvmerge and mkvextract commands start from an index of 0. Therefore, when using these two commands, we need to refer to the subtitle track IDs as 2 and 3, respectively.
Some MKV files may contain multiple subtitles, so we need to choose which one we want to extract.
Let’s extract the English subtitle using mkvextract and then store it in an SRT file named sub-en.srt:
$ mkvextract tracks vsshort-vorbis-subs.mkv 2:sub-en.srt
Extracting track 2 with the CodecID 'S_TEXT/UTF8' to the file 'sub-en.srt'. Container format: SRT text subtitles
Progress: 100%
$ head sub-en.srt
1
00:00:04,700 --> 00:00:06,736
where are you going so early?
...
Let’s break down the command:
We then used the head command to take a quick peek at the first part of the file.
Additionally, if we want to extract the German subtitle, we can simply change the track ID to 3 and store the subtitle in a different file, such as sub-de.srt:
$ mkvextract tracks vsshort-vorbis-subs.mkv 3:sub-de.srt
Extracting track 3 with the CodecID 'S_TEXT/UTF8' to the file 'sub-de.srt'. Container format: SRT text subtitles
Progress: 100%
$ head sub-de.srt
1
00:00:04,700 --> 00:00:06,736
Wo gehst du so früh hin?
...
At this point, we’ve successfully exported the subtitles from the MKV file using MKVToolNix.
FFmpeg is a popular framework for manipulating multimedia files.
The FFmpeg package is available on the Debian official repository under its canonical name, ffmpeg.
Let’s install it:
$ sudo apt install ffmpeg
$ ffmpeg -version
ffmpeg version 5.1.4-0+deb12u1 Copyright (c) 2000-2023 the FFmpeg developers
...
Once installed, we should be able to check its version number.
Similar to mkvextract, we need to find the subtitle track ID or the subtitle stream before extracting it:
$ ffmpeg -i vsshort-vorbis-subs.mkv 2>&1 | grep Stream
Stream #0:0: Video: msmpeg4v3 (DIV3 / 0x33564944), yuv420p, 640x352, SAR 1:1 DAR 20:11, 23.98 fps, 23.98 tbr, 1k tbn (default)
Stream #0:1: Audio: vorbis, 48000 Hz, stereo, fltp (default)
Stream #0:2: Subtitle: subrip (default)
Stream #0:3: Subtitle: subrip
Let’s break down the command:
From the command output, we can see that the MKV file contains two subtitles on input Stream #0: index 2 and 3.
Stream #0 represents the first input file. This is because ffmpeg can accept multiple input files for various media manipulations, such as concatenating videos.
Let’s extract the English subtitle:
$ ffmpeg -i vsshort-vorbis-subs.mkv -map 0:s:0 sub-en-ffmpeg.srt
$ head sub-en-ffmpeg.srt
1
00:00:04,700 --> 00:00:06,736
where are you going so early?
...
We used the head command to print out the first part of the subtitle file to ensure the subtitle was exported correctly.
Let’s break down the ffmpeg command.
First, we have the -i option, followed by a filename, vsshort-vorbis-subs.mkv. This indicates the input filename.
Then, we have the -map 0:s:0 option. This specifies which subtitle stream to include in the output:
Finally, we have the output filename: sub-en-ffmpeg.srt.
In case we want to extract the German subtitle, we just need to change the subtitle stream index to 1, and store the output to a different file, such as sub-de-ffmpeg.srt:
$ ffmpeg -i vsshort-vorbis-subs.mkv -map 0:s:1 sub-de-ffmpeg.srt
$ head sub-de-ffmpeg.srt
1
00:00:04,700 --> 00:00:06,736
Wo gehst du so früh hin?
...
Unsurprisingly, the ffmpeg command also extracted the German subtitle successfully.
In this article, we learned how to export subtitles from an MKV file using MKVToolNix and FFmpeg. Both tools require the subtitle index, and we can find the index using the mkvinfo command or the ffmpeg -i command.
Afterwards, we used the mkvextract command and ffmpeg -map command to extract the subtitle.
Finally, we used the head command to verify that all subtitle files were exported correctly.