Ekstrak subtitle dari file mkv

39

Masalahnya adalah bahwa videoplayers di Ubuntu memiliki masalah dengan subtitle eropa pusat terintegrasi. Solusinya adalah mengekstraknya. Apakah ada yang tahu jika ada perintah di terminal atau program untuk mengekstrak subtitle dari file mkv?

vladmateinfo
sumber

Jawaban:

58

Instal mkvtoolnixdengan sudo apt-get install mkvtoolnix.

Jalankan dari terminal: mkvextract tracks <your_mkv_video> <track_numer>:<subtitle_file.srt>

Gunakan mkvinfountuk mendapatkan informasi tentang trek.

Dengan menggunakan utilitas ini Anda dapat mengekstrak lagu apa pun, bahkan audio atau video.

Cornelius
sumber
9
jangan gunakan mkvinfoseperti yang dikatakan hal-hal seperti "Nomor trek: 2 (ID trek untuk mkvmerge & mkvextract: 1)" yang membingungkan. gunakanmkvmerge -i <filename>
gcb
Juga perhatikan bahwa, sebagaimana ditentukan dalam dokumen , mkvextract menentukan format output file berdasarkan tipe trek, bukan ekstensi yang diberikan (jadi periksa tipe seperti yang dilaporkan oleh mkvmerge -i <filename>).
kartografer
Apakah data (byte) teks film ditempatkan di semua wadah file? karena file video yang lebih besar semakin lambat kerjanya ... (500mb 1 gb 4gb .mkv file) Saya pikir itu akan bekerja lebih cepat dan saya pikir byte subtitle ditempatkan pada bagian tertentu dari file wadah video tetapi sepertinya ffmpeg atau mkvextract dibaca semua file dan ekstrak subtitle hanya setelah membaca semua file (ini sangat lambat)
user25
3
@ gcb dan bagaimana membingungkannya jika dikatakan dalam ID track bahasa Inggris untuk mkvmerge & mkvextract ? itu mudah, cukup gunakan ID trek itu untuk mkvextract atau mkvmerge. Panjang dan indeks elemen dalam pemrograman Array juga membingungkan bagi Anda?
user25
Mengapa Anda mengekspor semua terjemahan sebagai "SRT". Kami tidak tahu apakah itu subtitle grafis dan kami tidak tahu formatnya (SUP, SUB, dll.).
mgutt
8

Anda dapat menggunakan mkvtoolnix.

sudo apt-get install mkvtoolnix

Tip lain sekarang karena file mkv dapat berisi banyak subtitle, jadi tipnya adalah skrip ini yang dapat Anda cari bahasa yang Anda inginkan, jadi misalnya jika Anda ingin bahasa Inggris, itu akan mengunduh hanya bahasa Inggris.

Skrip:

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

Simpan skrip ini dengan nama youwant.sh dan buat itu bisa dieksekusi

Sekarang di terminal ubah direktori ke folder skrip dan tulis ./nameyouwant.sh /pathtosave

nux
sumber
Anehnya, itu tidak bekerja untuk satu video tetapi dengan menjalankan perintah yang diberikan dalam jawaban yang diterima itu berhasil.
Hunsu
Terima kasih untuk skrip yang bagus. Bisakah Anda menambahkan penjelasan mengapa Anda menghapus kredit di akhir subtitle? Bagian skrip itu tidak berfungsi untuk saya dan menghasilkan file srt kosong.
m000
1
Jawaban ini tampaknya diambil dari computernerdfromhell.com . Alasan yang diberikan untuk menghapus kredit adalah: "Subtitle Belanda memiliki kebiasaan memasukkan kredit mereka atau berteriak-teriak di beberapa baris subtitle terakhir. Tidak ada yang salah dengan itu, kecuali ketika itu terjadi tepat setelah baris terakhir berbicara di dalam Film ini mungkin berlangsung 5 menit lagi, saya tidak ingin akhir aproaching diberikan oleh DaNoodleBrain memberikan teriakan kepada BoogerGuzzler, jadi saya menghapusnya dengan regex sederhana lain "
Dror S.