How to add and remove subtitles in an MKV file?

82,646

Solution 1

Removing subtitles:

mkvmerge -o output.mkv input.mkv -S # remove all subtitle tracks, note the uppercase S
mkvmerge -o output.mkv input.mkv -s 3,4 # include only subtitle tracks 3 and 4
mkvmerge -o output.mkv input.mkv -s '!3' # include all subtitle tracks except 3
mkvmerge -i input.mkv # show track numbers

Adding subtitles:

mkvmerge -o output.mkv input.mkv subs.srt
mkvmerge -o output.mkv input.mkv --language 0:ger --track-name 0:German subs.srt

Extracting subtitles:

mkvextract tracks input.mkv 3:subs.srt
for f in *.mkv; do
  sub=$(mkvmerge -i "$f" | awk '$4=="subtitles"{print;exit}')
  [[ $sub ]] || continue
  [[ $sub =~ S_TEXT/ASS ]] && ext=ass || ext=srt
  track=$(awk -F '[ :]' '{print $3}' <<< "$sub")
  mkvextract tracks "$f" "$track:${f%mkv}$ext"
done

mkvmerge and mkvextract can be installed with brew install mkvtoolnix.

Solution 2

There are two basic ways of showing subtitles. You can encode the pixels into the video itself. This is called "hardsubbing". The advantage here is the simplicity for the video player, it's just a video stream. The disadvantages are that you had to reencode the video, which takes time, and has some fidelity loss. If you get a better translation, well, it's pixels in the video. And you can only have one language.

What is somewhat better is "softsubbing", which is to have a text file someplace, separate from the video stream. There are many different formats of subtitle files, but at their base they all have "text, start what time, remove what time" at their core. Some have additional features like colors and orientation on the screen. The advantage to this is you can have multiple languages (think of a DVD, you have multiple languages available) and you can fix typos and such in the file. And if you don't need subtitles, well you just turn them off.

Softsubs can either be separate files - most players will automagically look for subtitles with the same name (different extension) as the main video. Or certain container file formats (like MKV) can have them embedded inside. Check out MKVtoolnix (there is a mac port) for MKV file tools. This should let you embed softsubs without reencoding.

Note that not all players can support all formats. My experience is that XBMC has issues with SSA files, but the much simpler SRT files are fine. VLC will play anything, if it's supported on your platform.

Solution 3

I realize this is an old question and user495470’s answer has been accepted as of 2013, but since part of the question is about adding subtitles to files, I wanted to add this new addition.

Basically, I needed to merge dozens of .ass subtitles into similarly named MKV files, so doing this one command at a time was not cutting it. So I whipped up this simple Bash script that will search the current directory it’s run from for .ass files and then merge them as expected.

find -E . -maxdepth 1 -type f -iregex '.*\.(ASS|SRT)$' |\
  while read FILEPATH
  do
    DIRNAME=$(dirname "${FILEPATH}");
    BASENAME=$(basename "${FILEPATH}");
    FILENAME="${BASENAME%.*}";
    EXTENSION="${BASENAME##*.}"
    mkvmerge -o "/Users/jake/${FILENAME}"-NEW.mkv "${FILENAME}".mp4 --language 0:eng --track-name 0:English "${FILENAME}"."${EXTENSION}"
  done

Of course, this simple script assumes that the subtitles are English and merges them as such, but that can be manually adjusted per usage need; the big issue of automatically merging the subtitles with the MKV is solved by a simple script like this.

Share:
82,646
Rodrigo Jimenez
Author by

Rodrigo Jimenez

Soluto #SOreadytohelp

Updated on September 18, 2022

Comments

  • Rodrigo Jimenez
    Rodrigo Jimenez over 1 year

    I have a good quality MKV file that has several subtitle options. I want to add an additional subtitle file to the list. I'm using OSX.

    Some search online led me to use video converters, and basically re-encode the movie into a new file. That seems really overkill to me. Plus I may loose the previous subtitles, and some image quality along the way.

  • evilsoup
    evilsoup almost 11 years
    Good answer, though it should be noted that some soft-subtitles -- especially DVD subtitles -- are bitmap-based, rather than text-based. The main effect of which is to make them almost impossible to edit -_-
  • Karan
    Karan almost 11 years
    Yep, IDX+SUB VOBsub, where IDX is a text file but SUB contains bitmaps.
  • Bora
    Bora almost 11 years
    MKVMerge GUI is already available on Mac OS X, but nevertheless, it's a good how to for console fans.
  • Bora
    Bora almost 11 years
    changed link to the direct download page.
  • Mathias Bynens
    Mathias Bynens almost 8 years
    Note that the above commands for adding subtitles also set the subtitles as “enabled by default” when playing the file. (This flag can be confirmed using the MKVMerge GUI.) To avoid this, use --default-track '0:0'.
  • Det
    Det about 4 years
    The -s 3,4 now does the opposite, it preserves the tracks 3 and 4. $ mkvmerge.exe --version mkvmerge v43.0.0 ('The Quartermaster') 64-bit
  • Det
    Det about 4 years
    Actually looks like it's been that way all this time superuser.com/posts/98401/revisions . Would've been weird to break default functionality.
  • seisatsu
    seisatsu almost 4 years
    With mkvmerge the -S option doesn't work unless it comes before the filenames, at least on v31.0.0.
  • Sujay Phadke
    Sujay Phadke almost 3 years
    @seisatsu Thanks for that! Yes, it doesn't work if the option is specified after filenames! That's just stupid. Confirmed with "mkvmerge v56.1.0". The "-s" option keeps those track numbers. Note: Get the track numbers from mkvinfo: "+ Track number: 2 (track ID for mkvmerge & mkvextract: 1)". Use the number in the parenthesis, not the one appearing outside.