Untertitel aus MKV-Dateien extrahieren

39

Das Problem ist, dass Videospieler in Ubuntu ein Problem mit integrierten mitteleuropäischen Untertiteln haben. Die Lösung besteht darin, sie zu extrahieren. Weiß jemand, ob es im Terminal einen Befehl oder ein Programm zum Extrahieren des Untertitels aus einer MKV-Datei gibt?

vladmateinfo
quelle

Antworten:

58

Installieren Sie mkvtoolnixmit sudo apt-get install mkvtoolnix.

Vom Terminal ausführen: mkvextract tracks <your_mkv_video> <track_numer>:<subtitle_file.srt>

Verwenden Sie mkvinfodiese Option , um Informationen zu Titeln abzurufen.

Mit diesem Dienstprogramm können Sie jeden Track extrahieren, sogar Audio oder Video.

Cornelius
quelle
9
Verwenden mkvinfoSie keine verwirrenden Dinge wie "Titelnummer: 2 (Titel-ID für mkvmerge & mkvextract: 1)". usemkvmerge -i <filename>
gcb
Beachten Sie auch, dass, wie in den Dokumenten angegeben , mkvextract das Dateiausgabeformat vom Spurtyp und nicht von der angegebenen Erweiterung abhängt (überprüfen Sie also den Typ wie von gemeldet mkvmerge -i <filename>).
Kartograf
Sind Daten (Bytes) von Untertiteln in allen Dateicontainern enthalten? Weil die größere Videodatei umso langsamer arbeitet ... (500 MB, 1 GB, 4 GB, MKV-Datei) Ich dachte, sie würde viel schneller funktionieren, und ich dachte, dass die Bytes der Untertitel in einem bestimmten Teil der Videocontainerdatei platziert sind, aber es scheint, als würde sie ffmpeg oder mkvextract lesen alle Dateien und extrahieren Untertitel nur nach dem Lesen aller Dateien (es ist sehr langsam)
user25
2
@gcb und wie verwirrend ist es, wenn in englischer Track-ID für mkvmerge & mkvextract steht ? Es ist ganz einfach, verwenden Sie einfach diese Track-ID für mkvextract oder mkvmerge. Die Länge und der Index des Arrays in der Programmierung sind für Sie ebenfalls verwirrend?
user25
8

Sie können mkvtoolnix verwenden.

sudo apt-get install mkvtoolnix

Ein weiterer Tipp, da MKV-Dateien möglicherweise viele Untertitel enthalten. Der Tipp ist also dieses Skript, mit dem Sie nach der gewünschten Sprache suchen können. Wenn Sie also beispielsweise Englisch möchten, wird nur Englisch heruntergeladen.

Skript :

#!/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

Speichern Sie dieses Skript nameyouwant.sh und machen Sie es ausführbar

Wechseln Sie nun im Terminal in den Skriptordner und schreiben Sie ./nameyouwant.sh /pathtosave

nux
quelle
Seltsamerweise funktionierte es nicht für ein Video, sondern durch Ausführen der in der akzeptierten Antwort angegebenen Befehle.
Hunsu
Danke für das nette Drehbuch. Könnten Sie eine Erklärung hinzufügen, warum Sie die Credits am Ende der Untertitel entfernen? Dieser Teil des Skripts funktioniert bei mir nicht und führt zu einer leeren srt-Datei.
m000
1
Diese Antwort scheint von computernerdfromhell.com zu stammen . Der Grund für das Entfernen der Credits ist: "Niederländische Untertitel haben die Angewohnheit, ihre Credits oder Shout-outs in die letzten Zeilen der Untertitel einzufügen. Daran ist nichts auszusetzen, es sei denn, dies geschieht unmittelbar nach der letzten Zeile in der Der Film könnte noch 5 Minuten dauern. Ich möchte nicht, dass DaNoodleBrain BoogerGuzzler zum Abschied grüßt, also entferne ich sie mit einem anderen einfachen Regex "
Dror S.