2013年5月4日土曜日

ffmpegでDVDの字幕を焼き込む方法

ffmpegを用いてDVDのビットマップ字幕を動画に焼き込む方法(ハードコードする方法)を説明したい。はじめに断っておくが、これは暫定仕様だそうだ。(いつになるか分からないが)ビットマップ字幕に正式に対応したら、使えなくなる方法である。またDVDの違法コピーは法律で禁止されているので、その点も注意されたい。

手順は4項目に分かれる。

  1. DVDを読み出す。
  2. 字幕トラックをスキャンして読み出す。
  3. 字幕のカラーパレットを読み取り、RGB変換する。
  4. 字幕トラックを動画に焼き込む。

以下、順番に説明する。

  1. DVDを読み出す。

    • UNIXのcatコマンドとniceコマンドを用いる方法

      cat /Volumes/DVD_VIDEO/VIDEO_TS/VTS_01_[1234567].VOB | nice ffmpeg -i - ...
      
    • mplayerを用いる方法。
      (mplayerのビルド手順はこちらを参照)

      mplayer -dumpstream dvd://1
      

      できあがると、stream.dumpというファイルが作成される。

  2. 字幕トラックをスキャンして読み出す。
    字幕トラックはビデオトラックと同時に始まる訳ではない。概ねビデオトラックが始まって少し経ってから字幕トラックが始まる。
    ffmpegに、このことを告げる(スキャンさせて見つけ出させる)必要がある。
    一番重要なのは「-probesize 60M」である。単位はマイクロ秒で60百万マイクロ秒、つまり1分間スキャンさせる。
    万が一字幕トラックが一分間以内に始まらなかった場合は、値を増やすことになる。

    ffmpeg -analyzeduration 60M -probesize 60M -i ...
    
  3. 字幕のカラーパレットを読み取り、RGB変換する。
    DVDにはカラーパレットというものがあり、これによって字幕の色が決まる。(字幕の色以外に関係するものがあるのかは不明)
    このカラーパレットを読み出してffmpegに渡す必要がある。(ffmpegは自動的にカラーパレットを読み込むことはできない)
    カラーパレットの読み出しはS.T.氏の尽力によりIFOファイルから直接読み出せるようになった。こちらからダウンロードして欲しい。
    ダウンロードしたら、実行ファイルをパスの通ったところにインストール(Macの場合/usr/local/binなど)する。コピーしたら、次のようにDVD本編のIFOファイルを引数として実行する。(リターンキーを押す)

    iforgb /Volumes/DVD_VIDEO/VIDEO_TS/VTS_01_0.IFO
    

    RGBパレットは、101010,101010,7d7d7d,d5d5d5,808080,808080,808080,808080,808080,808080,808080,808080,808080,808080,808080,808080のようになる。

  4. 字幕トラックを動画に焼き込む。
    最後に複雑なビデオフィルタ(-filter_complex)を用いてビデオトラックに字幕トラックをオーバーレイさせて焼き込む。

    • catコマンドでDVDを読み出す場合

      cat /Volumes/DVD_VIDEO/VIDEO_TS/VTS_01_[1234567].VOB | nice -i - -filter_complex "[0:v][0:s]overlay[v]"...
      
    • mplayerのストリームダンプの場合

      ffmpeg -i stream.dump -filter_complex "[0:v][0:s]overlay[v]"...
      

    この例では[0:v]」がビデオストリーム「[0:s]が字幕ストリームである。

以上をまとめると、次のようになる。

  • catコマンドでDVDを読み出す場合

    cat /Volumes/DVD_VIDEO/VIDEO_TS/VTS_01_[1234567].VOB | nice \
    ffmpeg -analyzeduration 60M -probesize 60M \
    -palette \
    101010,101010,7d7d7d,d5d5d5,\
    808080,808080,808080,808080,\
    808080,808080,808080,808080,\
    808080,808080,808080,808080\
    -i - \
    -filter_complex "[0:v][0:s]overlay[v]" \
    -map [v] -map 0:a \
    -c:v libx264 -preset slow -crf 23 -level 41 -c:a libfdk_aac -b:a 128k \
    DVD_VIDEO.mp4
    
  • mplayerのストリームダンプの場合

    ffmpeg -analyzeduration 60M -probesize 60M \
    -palette \
    101010,101010,7d7d7d,d5d5d5,\
    808080,808080,808080,808080,\
    808080,808080,808080,808080,\
    808080,808080,808080,808080\
    -i stream.dump \
    -filter_complex "[0:v][0:s]overlay[v]" \
    -map [v] -map 0:a \
    -c:v libx264 -preset slow -crf 23 -level 41 -c:a libfdk_aac -b:a 128k \
    DVD_VIDEO.mp4
    

なお、S.T.氏の尽力によりffmpeg version N-67684-g12630fa(2014/11/15 20:50:39 +0900コミット)から、ffmpegに直接IFOファイルをオプションとして与えることでカラーパレットを取り込むことができるようになった。この場合は、以下のようになる。

  • catコマンドでDVDを読み出す場合

    cat /Volumes/DVD_VIDEO/VIDEO_TS/VTS_01_[1234567].VOB | nice \
    ffmpeg -analyzeduration 60M -probesize 60M \
    -ifo_palette /Volumes/DVD_VIDEO/VIDEO_TS/VTS_01_0.IFO \
    -i - \
    -filter_complex "[0:v][0:s]overlay[v]" \
    -map [v] -map 0:a \
    -c:v libx264 -preset slow -crf 23 -level 41 -c:a libfdk_aac -b:a 128k \
    DVD_VIDEO.mp4
    
  • mplayerのストリームダンプの場合

    ffmpeg -analyzeduration 60M -probesize 60M \
    -ifo_palette /Volumes/DVD_VIDEO/VIDEO_TS/VTS_01_0.IFO \
    -i stream.dump \
    -filter_complex "[0:v][0:s]overlay[v]" \
    -map [v] -map 0:a \
    -c:v libx264 -preset slow -crf 23 -level 41 -c:a libfdk_aac -b:a 128k \
    DVD_VIDEO.mp4
    

以上。

改訂履歴

2014.12.17改訂

  1. DVDの取り込み方法で、catコマンドを用いる方法を復活。catでもmplayerでもどちらでも良いため。

2014.11.17改訂

  1. カラーパレットの読み出しがffmpegに実装されたので追記。(Special Thanks to Mr. S.T.)ただし、実行ファイルの方法も残した。

2014.10.21改訂

  1. カラーパレットの読み出しを表計算からUNIX実行ファイルに変更(Special Thanks to Mr. S.T.)

2014.10.16改訂

  1. DVDの取り込み方法を直接DVDにアクセスする形からmplayerを用いる形に変更
  2. DVD字幕が黒地に黄色になる問題を解決するため、カラーパレットの読み出しとffmpegへの反映方法を追加

0 件のコメント :

コメントを投稿