Извлечь субтитры из файлов MKV

39

Проблема в том, что у видеоплееров в Ubuntu есть проблема с интегрированными субтитрами в центральной Европе. Решение состоит в том, чтобы извлечь их. Кто-нибудь знает, есть ли в терминале команда или программа для извлечения субтитров из файла mkv?

vladmateinfo
источник

Ответы:

58

Установить mkvtoolnixс sudo apt-get install mkvtoolnix.

Запустить из терминала: mkvextract tracks <your_mkv_video> <track_numer>:<subtitle_file.srt>

Используйте mkvinfoдля получения информации о треках.

С помощью этой утилиты вы можете извлечь любую дорожку, даже аудио или видео.

Корнелий
источник
9
не используйте, mkvinfoкак говорится, такие вещи, как «номер трека: 2 (идентификатор трека для mkvmerge & mkvextract: 1)», которые вводят в заблуждение. использованиеmkvmerge -i <filename>
gcb
Также обратите внимание, что, как указано в документации , mkvextract формат вывода файла определяется по типу дорожки, а не по заданному расширению (поэтому проверьте тип в соответствии с сообщением mkvmerge -i <filename>).
картограф
данные (байты) субтитров размещены внутри всего файлового контейнера? потому что чем больше видеофайл, тем медленнее он работает ... (500 МБ 1 ГБ, 4 ГБ .mkv файл) Я думал, что это будет работать намного быстрее, и я думал, что байты субтитров помещаются в определенную часть файла контейнера видео, но кажется, что ffmpeg или mkvextract читает все файлы и извлечь субтитры только после чтения всего файла (это очень медленно)
user25
3
@gcb и как это сбивает с толку, если на английском языке написано идентификатор трека для mkvmerge & mkvextract ? это просто, просто используйте этот идентификатор трека для mkvextract или mkvmerge. Длина массива и индекс элементов в программировании также сбивают вас с толку?
user25
Почему вы экспортируете все субтитры как «SRT». Мы не знаем, являются ли они графическими субтитрами, и мы не знаем формат (SUP, SUB и т. Д.).
MGUTT
8

Вы можете использовать mkvtoolnix.

sudo apt-get install mkvtoolnix

Еще один совет, потому что файлы mkv могут содержать много субтитров, поэтому совет - это скрипт, в котором вы можете искать нужный вам язык, например, если вы хотите английский, он загрузит только английский.

Сценарий:

#!/bin/bash
# Extract subtitles from each MKV file in the given directory

# If no directory is given, work in local dir
if [ "$1" = "" ]; then
  DIR="."
else
  DIR="$1"
fi

# Get all the MKV files in this dir and its subdirs
find "$DIR" -type f -name '*.mkv' | while read filename
do
  # Find out which tracks contain the subtitles
  mkvmerge -i "$filename" | grep 'subtitles' | while read subline
  do
    # Grep the number of the subtitle track
    tracknumber=`echo $subline | egrep -o "[0-9]{1,2}" | head -1`

    # Get base name for subtitle
    subtitlename=${filename%.*}

    # Extract the track to a .tmp file
    `mkvextract tracks "$filename" $tracknumber:"$subtitlename.srt.tmp" > /dev/null 2>&1`
    `chmod g+rw "$subtitlename.srt.tmp"`


    # Do a super-primitive language guess: ENGLISH
    langtest=`egrep -ic ' you | to | the ' "$subtitlename".srt.tmp`
    trimregex=""



    # Check if subtitle passes our language filter (10 or more matches)
    if [ $langtest -ge 10 ]; then
      # Regex to remove credits at the end of subtitles (read my reason why!)
      `sed 's/\r//g' < "$subtitlename.srt.tmp" \
        | sed 's/%/%%/g' \
        | awk '{if (a){printf("\t")};printf $0; a=1; } /^$/{print ""; a=0;}' \
        | grep -iv "$trimregex" \
        | sed 's/\t/\r\n/g' > "$subtitlename.srt"`
      `rm "$subtitlename.srt.tmp"`
      `chmod g+rw "$subtitlename.srt"`
    else
      # Not our desired language: add a number to the filename and keep anyway, just in case
      `mv "$subtitlename.srt.tmp" "$subtitlename.$tracknumber.srt" > /dev/null 2>&1`
    fi
  done
done

Сохраните этот скрипт nameyouwant.sh и сделайте его исполняемым

Теперь в терминале перейдите в каталог скриптов и напишите ./nameyouwant.sh /pathtosave

Nux
источник
Странно, это не сработало для одного видео, но, выполнив команды, приведенные в принятом ответе, сработало.
Хунсу
Спасибо за отличный сценарий. Не могли бы вы добавить объяснение, почему вы удаляете титры в конце субтитров? Эта часть скрипта не работает для меня и приводит к пустому файлу srt.
m000
1
Этот ответ, кажется, взят с computernerdfromhell.com . Причина, по которой убираются титры: «Голландские субтитры имеют привычку вставлять свои кредиты или выкрики в последние несколько строк субтитров. В этом нет ничего плохого, кроме случаев, когда это происходит сразу после последней строки, произнесенной в фильм. Фильм может продолжаться еще 5 минут, я не хочу, чтобы DaNoodleBrain отдавал одобрительный конец BoogerGuzzler, поэтому я удаляю их с помощью другого простого регулярного выражения "
Дрор С.