Programster's Blog

Tutorials focusing on Linux, programming, and open source

Subtitles Cheatsheet

Listing Tracks

The easiest way to list the subtitle tracks is by running:

mkvmerge -i myFile.mkv


Mkv files often come with subtitles "buried" within them which are not "hard subbed" (built into the image). These can be extracted with:

mkvextract tracks input.mkv \
[track number]:output.mkv

This will not remove the subtitles from the mkv file.

This may extract an ass or srt file

Remove Specific Tracks

If you want to remove a subtitle track, you need to recreate the mkv file and copy across the tracks that you want to keep. The command below will keep tracks 1 and 3, so we are "removing" track 2 (it won't be in the output file).

mkvmerge -o output.mkv \
--subtitle-tracks 1,3 \

Remove All Subtitles

The command below will create an output.mkv file from input.mkv, but with no subtitles within it.

mkvmerge -o output.mkv \
--no-subtitles \


If you have two separate files, one MKV video file, and one srt subtitles file, you can merge them easily with:

mkvmerge -o output.mkv \
input.mkv \


You can convert from ass to srt with this tool. However, I found that it would insert ? characters wherever it found characters it didn't understand. For example there is a special character for three dots ... which is really common.


VLC media player can use g and h to adjust times to see how much of a delay you need

You can shift srt subtitles (even by fractions of a second) with this script:


set -o errexit -o noclobber -o nounset -o pipefail


shift_date() {
    date --date="$1 $date_offset" +%T,%N | cut -c 1-12

while read -r line
    if [[ $line =~ ^[0-9][0-9]:[0-9][0-9]:[0-9][0-9],[0-9][0-9][0-9]\ --\>\ [0-9][0-9]:[0-9][0-9]:[0-9][0-9],[0-9][0-9][0-9]$ ]]
        read -r start_date separator end_date <<<"$line"
        new_start_date="$(shift_date "$start_date")"
        new_end_date="$(shift_date "$end_date")"
        printf "%s %s %s\n" "$new_start_date" "$separator" "$new_end_date"
        echo "New date"
        printf "%s\n" "$line"

Example usage:

./ "+3.5 seconds" <