Estrai i sottotitoli dai file mkv


39

Il problema è che i videoregistratori di Ubuntu hanno un problema con i sottotitoli dell'Europa centrale integrati. La soluzione è estrarli. Qualcuno sa se c'è un comando nel terminale o un programma per estrarre i sottotitoli da un file mkv?

Risposte:


58

Installa mkvtoolnixcon sudo apt-get install mkvtoolnix.

Esegui dal terminale: mkvextract tracks <your_mkv_video> <track_numer>:<subtitle_file.srt>

Utilizzare mkvinfoper ottenere informazioni sui brani.

Usando questa utility puoi estrarre qualsiasi traccia, anche audio o video.


9
non usare mkvinfocome dice cose come "Numero traccia: 2 (ID traccia per mkvmerge & mkvextract: 1)" che sono fonte di confusione. usemkvmerge -i <filename>
gcb,

Si noti inoltre che, come specificato nei documenti , mkvextract determina il formato di output del file in base al tipo di traccia, non alla data estensione (quindi controllare il tipo come riportato da mkvmerge -i <filename>).
cartografo

i dati (byte) dei sottotitoli sono inseriti in tutti i contenitori di file? perché più grande è il file video più lento funziona ... (file 500m 1 gb 4gb .mkv) Ho pensato che avrebbe funzionato molto più velocemente e ho pensato che i byte dei sottotitoli fossero collocati in una parte specifica del file contenitore video ma sembra ffmpeg o mkvextract legge tutti i file ed estrai i sottotitoli solo dopo aver letto tutti i file (è molto lento)
user25

3
@gcb e come è confuso se dice in inglese l' ID traccia per mkvmerge & mkvextract ? è facile, basta usare quell'ID traccia per mkvextract o mkvmerge. La lunghezza e l'indice di elementi dell'array nella programmazione sono confusi anche per te?
user25

Perché esportare tutti i sottotitoli come "SRT". Non sappiamo se si tratta di sottotitoli grafici e non conosciamo il formato (SUP, SUB, ecc.).
mgutt

8

puoi usare mkvtoolnix.

sudo apt-get install mkvtoolnix

Un altro suggerimento ora perché i file mkv possono contenere molti sottotitoli, quindi il suggerimento è questo script che puoi cercare la lingua desiderata, quindi ad esempio se vuoi l'inglese scaricherà solo l'inglese.

Script:

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

Salvare questo script nameyouwant.sh e renderlo eseguibile

Ora nella directory di modifica terminale in cartella script e scrivere ./nameyouwant.sh /pathtosave


Cosa strana, non ha funzionato per un video, ma eseguendo i comandi indicati nella risposta accettata ha funzionato.
Hunsu,

Grazie per la bella sceneggiatura. Potresti aggiungere una spiegazione del motivo per cui rimuovi i crediti alla fine dei sottotitoli? Quella parte dello script non funziona per me e risulta in un file srt vuoto.
m000,

1
Questa risposta sembra essere presa da computernerdfromhell.com . Il motivo addotto per la rimozione dei crediti è: "I sottotitoli olandesi hanno l'abitudine di mettere i loro crediti o le loro urla nelle ultime righe dei sottotitoli. Niente di sbagliato in questo, tranne quando accade subito dopo l'ultima riga parlata nel film. Il film potrebbe continuare per altri 5 minuti, non voglio che la fine aproachica venga data da DaNoodleBrain dando urla a BoogerGuzzler, quindi li rimuovo con un'altra semplice regex "
Dror S.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.