Extraer subtítulos de archivos mkv

39

El problema es que los videoplayers en Ubuntu tienen un problema con los subtítulos integrados de Europa Central. La solución es extraerlos. ¿Alguien sabe si hay un comando en la terminal o un programa para extraer el subtítulo de un archivo mkv?

vladmateinfo
fuente

Respuestas:

58

Instalar mkvtoolnixcon sudo apt-get install mkvtoolnix.

Ejecutar desde la terminal: mkvextract tracks <your_mkv_video> <track_numer>:<subtitle_file.srt>

Utilícelo mkvinfopara obtener información sobre pistas.

Con esta utilidad, puede extraer cualquier pista, incluso audio o video.

Cornelio
fuente
9
no use mkvinfocomo dice cosas como "Número de pista: 2 (ID de pista para mkvmerge y mkvextract: 1)" que son confusas. usemkvmerge -i <filename>
gcb
También tenga en cuenta que, como se especifica en los documentos , mkvextract determina el formato de salida del archivo por tipo de pista, no por la extensión dada (así que verifique el tipo según lo informado por mkvmerge -i <filename>).
cartógrafo
¿Se colocan los datos (bytes) de los subtítulos dentro de todo el contenedor de archivos? porque cuanto más grande es el archivo de video, más lento funciona ... (500mb 1 gb 4gb .mkv file) Pensé que funcionaría mucho más rápido y pensé que los bytes de los subtítulos se colocan en una parte específica del archivo contenedor de video, pero parece ffmpeg o mkvextract reads todos los archivos y extraer subtítulos solo después de leer todos los archivos (es muy lento)
usuario25
3
@gcb y ¿cómo es confuso si dice en inglés ID de pista para mkvmerge & mkvextract ? es fácil, solo use esa ID de pista para mkvextract o mkvmerge. ¿La longitud de la matriz y el índice de elementos en la programación también es confuso para usted?
usuario25
¿Por qué exporta todos los subtítulos como "SRT"? No sabemos si son subtítulos gráficos y no sabemos el formato (SUP, SUB, etc.).
mgutt
8

puedes usar mkvtoolnix.

sudo apt-get install mkvtoolnix

Otro consejo ahora porque los archivos mkv pueden contener muchos subtítulos, por lo que el consejo es que este script puede buscar el idioma que desee, por ejemplo, si quiere inglés, descargará solo inglés.

Guión:

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

Guarde este script nameyouwant.sh y hágalo ejecutable

Ahora en el terminal, cambie el directorio a la carpeta de script y escriba ./nameyouwant.sh /pathtosave

nux
fuente
Lo extraño, no funcionó para un video, pero al ejecutar los comandos dados en la respuesta aceptada funcionó.
Hunsu
Gracias por el guión ingenioso. ¿Podría agregar una explicación de por qué elimina los créditos al final de los subtítulos? Esa parte del script no funciona para mí y da como resultado un archivo srt vacío.
m000
1
Esta respuesta parece estar tomada de computernerdfromhell.com . La razón dada para eliminar los créditos es: "Los subtituladores holandeses tienen la costumbre de poner sus créditos o agradecimientos en las últimas líneas de los subtítulos. No hay nada de malo en eso, excepto cuando sucede justo después de la última línea pronunciada en el película. La película podría continuar durante otros 5 minutos, no quiero que DaNoodleBrain regale el final de acercamiento dando saludos a BoogerGuzzler, así que los elimino con otra simple expresión regular "
Dror S.