Витяг підзаголовка з MKV файлів


39

Проблема полягає в тому, що у відеоплеєрів Ubuntu є проблема з інтегрованими центральними європейськими субтитрами. Рішення полягає в їх витягуванні. Хтось знає, чи є команда в терміналі чи програма для вилучення підзаголовка з файлу mkv?

Відповіді:


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>).
картограф

чи дані (байти) субтитрів розміщуються у всіх файлових контейнерах? тому що чим більший відеофайл, тим повільніше він працює ... (500mb 1 gb 4gb .mkv файл) Я думав, що він буде працювати набагато швидше, і я думав, що байти субтитрів розміщуються у певній частині файлу контейнера для відео, але, здається, ffmpeg або mkvextract читає усі файли та вилучення субтитрів лише після прочитання всього файлу (це дуже повільно)
користувач25

2
@gcb, і як це заплутано, якщо англійською мовою треку написано mkvmerge & mkvextract ? це просто, просто використовуйте цей ідентифікатор доріжки для mkvextract або mkvmerge. Довжина масиву та індекс елементів у програмуванні також для вас бентежать?
користувач25

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


Дивна річ, що він не працював для одного відео, але виконуючи команди, наведені у прийнятій відповіді, він працював.
Хунсу

Дякуємо за чудовий сценарій. Чи можете ви додати пояснення, чому ви видаляєте кредити наприкінці субтитрів? Ця частина сценарію не працює для мене і призводить до появи порожнього файлу srt.
m000

1
Ця відповідь, здається, взята з computernerdfromhell.com . Причина видалення кредитів полягає в тому, що "голландські субтитри мають звичку вводити свої кредити або викрикувати в останніх рядках субтитрів. Нічого поганого в цьому немає, крім випадків, коли це відбувається відразу після останнього рядка, промовленого в фільм. Може продовжуватися фільм ще 5 хвилин, я не хочу, щоб DaNoodleBrain видав вигуки BoogerGuzzler, тому я знімаю їх за допомогою іншого простого регексу "
Dror S.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.