Extrair legendas de arquivos MKV

39

O problema é que os reprodutores de vídeo no Ubuntu têm um problema com legendas integradas da Europa Central. A solução é extraí-las. Alguém sabe se existe um comando no terminal ou um programa para extrair a legenda de um arquivo mkv?

vladmateinfo
fonte

Respostas:

58

Instale mkvtoolnixcom sudo apt-get install mkvtoolnix.

Executar a partir do terminal: mkvextract tracks <your_mkv_video> <track_numer>:<subtitle_file.srt>

Use mkvinfopara obter informações sobre faixas.

Usando este utilitário, você pode extrair qualquer faixa, mesmo áudio ou vídeo.

Cornelius
fonte
9
não use mkvinfocomo ele diz coisas como "Número da faixa: 2 (ID da faixa para mkvmerge & mkvextract: 1)" que são confusas. usemkvmerge -i <filename>
gcb 22/04
Observe também que, conforme especificado nos documentos , mkvextract determina o formato de saída do arquivo por tipo de faixa, não a extensão especificada (verifique o tipo conforme relatado por mkvmerge -i <filename>).
cartógrafo
os dados (bytes) das legendas são colocados em todo o contêiner de arquivos? porque quanto maior o arquivo de vídeo, mais lento ele funciona ... (arquivo de 500mb 1 gb 4gb .mkv) Eu pensei que funcionaria muito mais rápido e pensei que os bytes das legendas são colocados em uma parte específica do arquivo de vídeo, mas parece leituras ffmpeg ou mkvextract todas as legendas de arquivo e extrair só depois de ler todos os arquivos (é muito lento)
USER25
2
@gcb e como é confuso se diz em inglês track ID para mkvmerge & mkvextract ? é fácil, basta usar o ID da faixa para mkvextract ou mkvmerge. O comprimento e o índice de elementos da matriz em programação também são confusos para você?
usar o seguinte comando
8

você pode usar mkvtoolnix.

sudo apt-get install mkvtoolnix

Outra dica agora, porque os arquivos mkv podem conter muitas legendas, portanto, a dica é esse script que você pode procurar pelo idioma desejado; por exemplo, se você deseja inglês, ele fará o download apenas em inglês.

Roteiro :

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

Salve este script nameyouwant.sh e torne-o executável

Agora, no diretório, mude o diretório para a pasta de scripts e escreva ./nameyouwant.sh /pathtosave

nux
fonte
Estranho, não funcionou para um vídeo, mas executando os comandos dados na resposta aceita funcionou.
Hunsu
Obrigado pelo script bacana. Você poderia adicionar uma explicação para remover os créditos no final das legendas? Essa parte do script não funciona para mim e resulta em um arquivo srt vazio.
M000
11
Esta resposta parece ser retirada de computernerdfromhell.com . A razão dada para remover os créditos é: "Os legendadores holandeses têm o hábito de colocar seus créditos ou gritos nas últimas linhas das legendas. Nada de errado nisso, exceto quando ocorre logo após a última linha falada no O filme pode continuar por mais 5 minutos, eu não quero que o DaNoodleBrain dê o fim que se aproxima, dando gritos ao BoogerGuzzler, então eu os removo com outro regex simples "
Dror S.