mkvファイルから字幕を抽出する


39

問題は、Ubuntuのビデオプレイヤーが統合された中央ヨーロッパの字幕に問題があることです。解決策はそれらを抽出することです。mkvファイルから字幕を抽出するためのコマンドが端末またはプログラムにあるかどうかは誰にもわかりますか?

回答:


58

でインストールmkvtoolnixsudo apt-get install mkvtoolnixます。

ターミナルから実行: mkvextract tracks <your_mkv_video> <track_numer>:<subtitle_file.srt>

mkvinfoトラックに関する情報を取得するために使用します。

このユーティリティを使用すると、オーディオやビデオを含む任意のトラックを抽出できます。


9
mkvinfo「トラック番号:2(mkvmergeおよびmkvextractのトラックID:1)」などの混乱を招くような言葉は使用しないでください。使用mkvmerge -i <filename>
GCB

また、docsで指定されいるように、指定されmkvextract 拡張子ではなく、トラックの種類によってファイルの出力形式が決定されることに注意してください(したがって、によって報告された種類を確認してくださいmkvmerge -i <filename>)。
地図製作者

字幕のデータ(バイト)はすべてのファイルコンテナー内に配置されていますか?ビデオファイルが大きいほど動作が遅くなるため...すべてのファイルを読み取った後にのみすべてのファイルと字幕を抽出する(非常に遅い)
-user25

2
@gcbとmkvmerge&mkvextractのトラックIDを英語で言うと混乱しますか?簡単です。mkvextractまたはmkvmergeにそのトラックIDを使用するだけです。プログラミングにおける要素の配列の長さとインデックスも混乱していますか?
ユーザー25

8

mkvtoolnixを使用できます。

sudo apt-get install mkvtoolnix

mkvファイルには多くの字幕が含まれている可能性があるため、もう1つのヒントがあります。したがって、ヒントは目的の言語を検索できるこのスクリプトです。

スクリプト:

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

このスクリプト名youwant.shを保存して実行可能にします

今、ターミナルでディレクトリをスクリプトフォルダに変更して書き込みます ./nameyouwant.sh /pathtosave


奇妙なことに、1つのビデオでは機能しませんでしたが、受け入れられた回答で指定されたコマンドを実行することで機能しました。
フンス14年

気の利いたスクリプトをありがとう。字幕の最後にクレジットを削除する理由を説明してください。スクリプトのその部分は私には機能せず、空のsrtファイルになります。
m000

1
この答えcomputernerdfromhell.comから取られたようです。クレジットを削除する理由は、次のとおりです。「オランダの字幕作成者は、字幕の最後の数行にクレジットまたはシャウトアウトを入れる習慣があります。それで問題はありません。映画フィルムは、私は別の単純な正規表現」でそれらを削除するので、私は、aproaching最後はBoogerGuzzlerにシャウトアウトを与えるDaNoodleBrain離れ与えられることを望んでいない、別の5分間に行くかもしれない。
ドロールS.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.