Mkv dosyalarından altyazıyı çıkart


39

Sorun, Ubuntu'daki video oynatıcıların, bütünleşik orta Avrupa altyazılarıyla ilgili bir sorun yaşaması. Çözüm, onları çıkarmak. Terminalde bir komut veya altyazıyı bir mkv dosyasından çıkarmak için bir program olup olmadığını bilen var mı?

Yanıtlar:


58

Yükleme mkvtoolnixile sudo apt-get install mkvtoolnix.

Terminalden çalıştır: mkvextract tracks <your_mkv_video> <track_numer>:<subtitle_file.srt>

mkvinfoİzler hakkında bilgi almak için kullanın .

Bu yardımcı programı kullanarak, herhangi bir parçayı, hatta ses veya videoyu çıkarabilirsiniz.


9
mkvinfokafa karıştırıcı "Parça numarası: 2 (mkvmerge ve mkvextract için parça kimliği" gibi şeyler söylediği gibi kullanmayın . kullanımmkvmerge -i <filename>
gcb 2

Ayrıca , belgelerde belirtildiği gibi , mkvextract dosya uzantısını, verilen uzantıya göre değil, parça türüne göre de belirlediğini unutmayın (bu nedenle, bildirildiği şekilde türü kontrol edin mkvmerge -i <filename>).
haritacı

tüm dosya kapsayıcılarına alt yazıların verileri (bayt) nedir? çünkü daha büyük video dosyası daha yavaş çalışırsa ... (500mb 1 gb 4 gb .mkv dosyası) Çok daha hızlı çalışacağını düşündüm ve altyazı baytlarının video konteyner dosyasının belirli bir yerine yerleştirildiğini düşündüm, ancak ffmpeg veya mkvextract okuyor tüm dosya ve altyazıları yalnızca tüm dosyayı okuduktan sonra ayıklayın (çok yavaş)
user25

2
@gcb ve İngilizce'de mkvmerge & mkvextract için parça kimliğini yazması nasıl kafa karıştırıcıdır ? kolaydır, sadece bu parça kimliğini mkvextract veya mkvmerge için kullanın. Dizinin uzunluğu ve programlamadaki elementler endeksi de kafa karıştırıcı mı?
kullanıcı25

8

mkvtoolnix'i kullanabilirsiniz.

sudo apt-get install mkvtoolnix

Şimdi başka bir ipucu çünkü mkv dosyaları birçok altyazı içerebilir, bu nedenle ipucu istediğiniz dili arayabileceğiniz bu betiktir, örneğin İngilizce istiyorsanız sadece İngilizce indirecektir.

Senaryo :

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

Bu betiği nameyouwant.sh olarak kaydedin ve çalıştırılabilir hale getirin

Şimdi terminal değiştirme dizininde script klasörüne yaz ve yaz ./nameyouwant.sh /pathtosave


Garip bir şey, bir video için işe yaramadı, ancak kabul edilen cevapta verilen komutları çalıştırarak çalıştı.
Hunsu

Şık senaryo için teşekkürler. Altyazının sonundaki kredileri neden kaldırdığınızı açıklayabilir misiniz? Komut dosyasının bu kısmı benim için çalışmıyor ve boş bir srt dosyasıyla sonuçlanıyor.
m000

1
Bu cevap computernerdfromhell.com adresinden alınmış gibi görünüyor . Kredileri kaldırmak için verilen sebep şudur: "Hollandalı altyazıcılar, altyazıların son birkaç satırına kredi verme ya da haykırış yapma alışkanlığına sahipler. Film 5 dakika daha devam edebilir, yaklaşan ucun DaNoodleBrain tarafından BoogerGuzzler'a seslenmeleri için verilmesini istemiyorum, bu yüzden onları başka bir basit regex ile kaldırdım "
Dror S.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.