Wyodrębnij napisy z plików mkv

39

Problem polega na tym, że gracze wideo w Ubuntu mają problem ze zintegrowanymi napisami z Europy Środkowej. Rozwiązaniem jest ich wyodrębnienie. Czy ktoś wie, czy w terminalu znajduje się polecenie lub program do wyodrębnienia napisów z pliku mkv?

vladmateinfo
źródło

Odpowiedzi:

58

Zainstaluj za mkvtoolnixpomocą sudo apt-get install mkvtoolnix.

Uruchom z terminala: mkvextract tracks <your_mkv_video> <track_numer>:<subtitle_file.srt>

Użyj, mkvinfoaby uzyskać informacje o utworach.

Za pomocą tego narzędzia możesz wyodrębnić dowolną ścieżkę, nawet audio lub wideo.

Cornelius
źródło
9
nie używaj, mkvinfoponieważ mówi takie rzeczy jak „Numer ścieżki: 2 (identyfikator ścieżki dla mkvmerge i mkvextract: 1)”, które są mylące. usemkvmerge -i <filename>
gcb 22.04.16
Zauważ też, że jak określono w dokumentacji , mkvextract określa format wyjściowy pliku według typu ścieżki, a nie danego rozszerzenia (więc sprawdź typ zgłoszony przez mkvmerge -i <filename>).
kartograf
czy dane (bajty) napisów są umieszczone we wszystkich kontenerach plików? ponieważ im większy plik wideo, tym wolniej działa ... (500mb 1 gb 4gb .mkv plik) Myślałem, że będzie działał znacznie szybciej i myślałem, że bajty napisów są umieszczone w określonej części pliku kontenera wideo, ale wygląda na to, że ffmpeg lub mkvextract czyta wszystkie pliki i wypakuj napisy dopiero po przeczytaniu wszystkich plików (jest to bardzo powolne)
25
2
@ gcb i jak to jest mylące, jeśli mówi w języku angielskim ID ścieżki dla mkvmerge & mkvextract ? to proste, wystarczy użyć tego identyfikatora ścieżki dla mkvextract lub mkvmerge. Długość tablicy i indeks elementów w programowaniu również jest dla ciebie mylący?
user25
8

możesz użyć mkvtoolnix.

sudo apt-get install mkvtoolnix

Kolejna wskazówka, ponieważ pliki mkv mogą zawierać wiele podtytułów, dlatego wskazówką jest ten skrypt, w którym możesz wyszukać żądany język, więc na przykład jeśli chcesz angielski, pobierzesz tylko angielski.

Skrypt:

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

Zapisz ten skrypt nameyouwant.sh i uczyń go wykonywalnym

Teraz w terminalu zmień katalog na folder skryptów i zapisz ./nameyouwant.sh /pathtosave

nux
źródło
Dziwne, nie zadziałało w przypadku jednego filmu, ale zadziałało po wykonaniu poleceń podanych w zaakceptowanej odpowiedzi.
Hunsu,
Dzięki za fajny skrypt. Czy możesz dodać wyjaśnienie, dlaczego usuwasz napisy na końcu napisów? Ta część skryptu nie działa dla mnie i skutkuje pustym plikiem srt.
m000
1
Ta odpowiedź wydaje się pochodzić z computernerdfromhell.com . Przyczyną usunięcia napisów jest: „Holenderscy napisy mają zwyczaj wkładania napisów lub wykrzykiwania w kilku ostatnich wierszach napisów. Nie ma w tym nic złego, z wyjątkiem sytuacji, gdy dzieje się to zaraz po ostatnim wierszu wypowiedzianym w Film może trwać jeszcze 5 minut, nie chcę, aby DaNoodleBrain rozdawał zbliżające się zakończenie, wykrzykując BoogerGuzzler, więc usuwam je z innym prostym wyrażeniem regularnym ”
Dror S.