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?

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.


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


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.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.