Extraire les sous-titres des fichiers mkv

39

Le problème est que les vidéastes de Ubuntu ont un problème avec les sous-titres intégrés en Europe centrale. La solution consiste à les extraire. Est-ce que quelqu'un sait s'il y a une commande dans le terminal ou un programme pour extraire le sous-titre d'un fichier mkv?

vladmateinfo
la source

Réponses:

58

Installer mkvtoolnixavec sudo apt-get install mkvtoolnix.

Courez depuis le terminal: mkvextract tracks <your_mkv_video> <track_numer>:<subtitle_file.srt>

Utilisez mkvinfopour obtenir des informations sur les pistes.

En utilisant cet utilitaire, vous pouvez extraire n’importe quelle piste, même audio ou vidéo.

Corneille
la source
9
ne pas utiliser mkvinfocomme il est dit des choses comme "Numéro de piste: 2 (ID de piste pour mkvmerge & mkvextract: 1)" qui sont déroutants. utilisermkvmerge -i <filename>
CGBC
Notez également que, comme spécifié dans la documentation , mkvextract détermine le format de sortie du fichier par type de piste, et non par l'extension donnée (vérifiez donc le type indiqué par mkvmerge -i <filename>).
cartographe
les données (octets) des sous-titres sont-elles placées dans tous les conteneurs de fichiers? parce que plus le fichier vidéo est volumineux, plus cela fonctionne lentement ... (500 Mo, 1 Go, 4 Go fichier .mkv) Je pensais que cela fonctionnerait beaucoup plus vite et je pensais que les octets des sous-titres sont placés dans une partie spécifique du fichier conteneur vidéo, mais il semble que ffmpeg ou mkvextract lisent tous les fichiers et extraire les sous-titres seulement après avoir lu tous les fichiers (c'est très lent)
user25
3
@gcb et comment est-il déroutant de savoir si, en anglais, l' identifiant de piste pour mkvmerge & mkvextract ? c'est facile, utilisez simplement cet identifiant de piste pour mkvextract ou mkvmerge. La longueur du tableau et l'index des éléments dans la programmation sont également déroutants pour vous?
utilisateur25
Pourquoi exportez-vous tous les sous-titres en tant que "SRT"? Nous ne savons pas s’il s’agit de sous-titres graphiques et nous ne connaissons pas le format (SUP, SUB, etc.).
mgutt
8

vous pouvez utiliser mkvtoolnix.

sudo apt-get install mkvtoolnix

Un autre conseil maintenant, car les fichiers mkv peuvent contenir de nombreux sous-titres. Ce script indique donc que vous pouvez rechercher la langue de votre choix. Ainsi, si vous souhaitez utiliser l'anglais, il ne téléchargera que l'anglais.

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

Sauvegardez ce script nameyouwant.sh et rendez-le exécutable

Maintenant, dans le répertoire de changement de terminal dans le dossier de script et écrire ./nameyouwant.sh /pathtosave

nux
la source
Chose étrange, cela n’a pas fonctionné pour une vidéo mais en exécutant les commandes données dans la réponse acceptée, cela a fonctionné.
Hunsu
Merci pour le script chouette. Pouvez-vous ajouter une explication sur la raison pour laquelle vous supprimez les crédits à la fin des sous-titres? Cette partie du script ne fonctionne pas pour moi et donne un fichier srt vide.
m000
1
Cette réponse semble provenir de computernerdfromhell.com . La raison invoquée pour supprimer les crédits est: "Les sous-titreurs hollandais ont l’habitude d’inscrire leurs crédits ou leurs commentaires dans les dernières lignes des sous-titres. Rien de mal à cela, sauf si cela se produit juste après la dernière ligne prononcée dans le fichier. Le film peut durer encore 5 minutes, je ne veux pas que DaNoodleBrain donne la fin approchante en remerciement de BoogerGuzzler, je les retire donc avec une autre regex simple "
Dror S.