今日も陽気にアレグロ技研

allegorgikenの気が向いた時の日記です

DVDからmp4(H.264 + HE-AAC)へのエンコード

試験もひと段落ついたし、エンコードのやり方もなんとかわかってきた感じなのでまとめてみよう。

  • 使うツール
    • mplayer, mencoder (DVDからのコピー、エンコード
    • ffmpeg(あると何かと便利。今回は音声の抜き出しに使う。)
    • mp4box(正確なmp4を作ってくれる。)
    • NeroAACEnc(NeroのAACエンコーダ。 HE-AACに対応した数少ないフリーのツール。)
  1. DVDからソースをHDDにコピーする。
    • DVDのソースは単一ファイルではなく、複数のファイルに分かれているのでそのままエンコードはやりにくい。
    • そのため、DVDを再生しながらそのコピーをとる「コアダンプ(core-dump)」を使う。
    • DVDのソースは多くの場合インターレースなので解除しながらコピーしておくと後がラクかも。
      • コマンド(通常コピー)
        • mplayer dvd://1 -dumpstream -dumpfile out.vob
      • コマンド(インターレース解除)
        • mplayer dvd://1 -dumpstream -dumpfile out.vob -vf yadif
      • コマンド(チャプター指定)
        • mplayer dvd://1 -dumpstream -dumpfile out.vob -vf yadif -chapter 1-5
  2. コピーしたデータをmencoderで映像のみエンコード
    • mencoderはmp4の出力がうまくできないため、映像のみエンコードする。
      • コマンド
        • mencoder out.vob -o out.h264 -of rawvideo -nosound -ovc x264 -x264encopts bitrate=400:threads=auto
      • コマンド(2パスエンコード
        • mencoder out.vob -o nul -of rawvideo -nosound -ovc x264 -x264encopts pass=1:bitrate=400:threads=auto
        • mencoder out.vob -o out.h264 -of rawvideo -nosound -ovc x264 -x264encopts pass=2:bitrate=400:threads=auto
      • コマンド(2パスエンコード、より綺麗に。)
        • mencoder out.vob -o nul -of rawvideo -nosound -ovc x264 -x264encopts pass=1:bitrate=400:subq=1:frameref=1:threads=auto
        • mencoder out.vob -o out.h264 -of rawvideo -nosound -ovc x264 -x264encopts pass=2:bitrate=400:subq=7:frameref=15:partitions=all:me=umh:threads=auto
  3. ffmpegでオーディオのみを抜き出す。
    • HE-AACエンコードすると、デコードされたときに始めの数ミリ秒に余計な空白が入り音ズレが生じることが多いみたい。
    • 音がズレたな、と思ったら開始数ミリ秒をカットして対処するか、動画に余計なフレームを入れてみよう。
      • コマンド
        • ffmpeg out.wav -i out.vob -ac 2 -ar 48000
      • コマンド(開始0.3秒カット)
        • ffmpeg out.wav -i out.vob -ac 2 -ar 48000 -ss 00:00:00.300(0.3秒)
  1. NeroAACEncで抜き出したオーディオをHE-AACにする。
    • ビットレート40000bps。HE-AACは16~48kbpsあたりで真価を発揮するらしい。
      • コマンド
        • neroaacenc -if out.wav -of out.aac -hev2 -br 40000 -2pass
      • コマンド(HE-AACが不適な音声には普通のAAC(AAC-LC)を使おう。)
        • neroaacenc -if out.wav -of out.aac -lc -br 96000 -2pass
  2. mp4boxで映像と音声を多重化。
    • fpsを指定しないとなぜか映像が25fpsになっちゃう。
      • コマンド
        • mp4box -add out.h264 -add out.aac -new out.mp4 -fps 29.97

以前にAVIVOによるエンコードを書いていたけど、低ビットレートにおいては
x264の2パスエンコードが最強ですね。DVD1枚分を300MBくらいに収めてしまえそう。
実際にh.264MPEG-2の四倍の効率らしいので、映像のクオリティを維持したいなら、
DVD一枚1.2GBくらいに収まることになるのかな。
まあ実際映像ビットレート800kbpsくらいでもかなりキレーです。
機会があれば3パスもやってみたいけど、Athlonじゃ遅いだろうなあ。