web-dev-qa-db-ja.com

MKVファイルの字幕を追加および削除する方法

字幕オプションがいくつかある良質のMKVファイルがあります。リストに字幕ファイルを追加したい。 OSXを使用しています。

オンラインで検索した結果、ビデオコンバーターを使用するようになり、基本的に映画を新しいファイルに再エンコードしました。それは本当に私にはやり過ぎのようです。加えて、以前の字幕や途中で画質が失われる可能性があります。

32
nute

字幕を削除する:

mkvmerge -o output.mkv input.mkv -S # remove all subtitle tracks
mkvmerge -o output.mkv input.mkv -s 3,4 # remove tracks 3 and 4
mkvmerge -o output.mkv input.mkv -s '!3' # remove all subtitle tracks except 3
mkvmerge -i input.mkv # show track numbers

字幕を追加する:

mkvmerge -o output.mkv input.mkv subs.srt
mkvmerge -o output.mkv input.mkv --language 0:ger --track-name 0:German subs.srt

字幕の抽出:

mkvextract tracks input.mkv 3:subs.srt
for f in *.mkv; do
  sub=$(mkvmerge -i "$f" | awk '$4=="subtitles"{print;exit}')
  [[ $sub ]] || continue
  [[ $sub =~ S_TEXT/ASS ]] && ext=ass || ext=srt
  track=$(awk -F '[ :]' '{print $3}' <<< "$sub")
  mkvextract tracks "$f" "$track:${f%mkv}$ext"
done

mkvmergeおよびmkvextractは、brew install mkvtoolnixを使用してインストールできます。

45
Lri

字幕を表示するには、2つの基本的な方法があります。ピクセルをビデオ自体にエンコードできます。これは「ハードサブ」と呼ばれます。ここでの利点は、ビデオプレーヤーのシンプルさです。これは単なるビデオストリームです。欠点は、ビデオを再エンコードする必要があり、時間がかかり、忠実度がいくらか失われることです。あなたがより良い翻訳を得れば、まあ、それはビデオのピクセルです。また、使用できる言語は1つだけです。

やや優れているのは、ビデオストリームとは別の場所にテキストファイルを置く「ソフトサブビング」です。字幕ファイルにはさまざまな形式がありますが、基本的にはすべて「テキスト、開始時刻、削除時刻」がコアにあります。一部には、画面上の色や向きなどの追加機能があります。これの利点は、複数の言語を使用できること(DVDと考えれば、複数の言語を使用できること)で、ファイル内のタイプミスなどを修正できることです。字幕が必要ない場合は、オフにしてください。

Softsubsは別のファイルにすることもできます-ほとんどのプレーヤーは、メインビデオと同じ名前(異なる拡張子)の字幕を自動的に探します。または、特定のコンテナファイル形式(MKVなど)にそれらを埋め込むことができます。 MKVファイルツールの MKVtoolnix (Macポートがあります)を確認してください。これにより、再エンコードせずにソフトサブを埋め込むことができます。

すべてのプレーヤーがすべてのフォーマットをサポートできるわけではないことに注意してください。私の経験では、XBMCにはSSAファイルに関する問題がありますが、より単純なSRTファイルで問題ありません。 VLCは、プラットフォームでサポートされていれば、何でも再生します。

4
Rich Homolka

これは古い質問で、 user495470 の回答は2013年に受け入れられましたが、質問の一部はファイルに字幕を追加することに関するものなので、この新しい追加を追加したいと思いました。

基本的に、私は数十の.ass字幕を同じような名前のMKVファイルにマージする必要があったので、一度に1つのコマンドを実行するだけではうまくいきませんでした。そこで、この単純なBashスクリプトを実行して、実行元の現在のディレクトリで.assファイルを検索し、期待どおりにマージします。

find -E . -maxdepth 1 -type f -iregex '.*\.(ASS|SRT)$' |\
  while read FILEPATH
  do
    DIRNAME=$(dirname "${FILEPATH}");
    BASENAME=$(basename "${FILEPATH}");
    FILENAME="${BASENAME%.*}";
    EXTENSION="${BASENAME##*.}"
    mkvmerge -o "/Users/jake/${FILENAME}"-NEW.mkv "${FILENAME}".mp4 --language 0:eng --track-name 0:English "${FILENAME}"."${EXTENSION}"
  done

もちろん、この単純なスクリプトは、字幕が英語であることを前提としており、そのようにそれらをマージしますが、使用法の必要に応じて手動で調整できます。字幕をMKVに自動的にマージするという大きな問題は、次のような簡単なスクリプトで解決されます。

0
JakeGould