x264とそのライブラリを用いたFFmpeg,MEncoderの可逆(ロスレス)エンコードに関する覚え書き(後半)
「x264とそのライブラリを用いたFFmpeg,MEncoderの可逆(ロスレス)エンコードに関する覚え書き(前半)」の続き。
FFmpegとMEncoderからのlibx264のロスレス指定について
FFmpeg
FFmpegにはコーデックごとにオプション群を一括で指定するプリセットの仕組みがあり、libx264向けには[インストール先(/usrなど)]/share/ffmpeg/libx264-[プリセット名].ffpresetというファイル群が用意されている(手元の環境ではlibx264関係のみ存在)。このプリセット名を-vpreオプションで指定するとそれに応じたプリセットファイルが開かれてその中のオプション指定が自動的に適用される。
この中にはロスレス指定のものが幾つかある(「lossless」を含む名前でいずれも「cqp=0」指定を含む)ため、いずれかを選択してエンコードをすればよい。プリセットによってエンコード後のファイルサイズが異なる。
下の例では同時に音声を無圧縮(符号付き16bitリトルエンディアン)にしており、代わりに-acodec flacで音声をFLACにすることもできるが、音がズレる場合があるようだ。
(高速・低圧縮率) $ ffmpeg -i [入力ファイル] -vcodec libx264 -vpre lossless_ultrafast -r [フレームレート] -acodec pcm_s16le -y ultrafast.avi -f avi (低速・高圧縮率) $ ffmpeg -i [入力ファイル] -vcodec libx264 -vpre lossless_slower -r [フレームレート] -acodec pcm_s16le -y slower.avi -f avi (非常に低速・更に少しだけ高圧縮率) $ ffmpeg -i [入力ファイル] -vcodec libx264 -vpre lossless_max -r [フレームレート] -acodec pcm_s16le -y max.avi -f avi
libx264向けには幾つかのロスレスのプリセットがあるが、エンコード時間とファイルサイズに影響するのみで、デコードした結果は同じ。エンコードが遅いものほど小さくなるが、このあたりは一般的な圧縮/伸長ソフトで圧縮率が指定できるものと同じような感じとなる。
下は(rawvideo + pcm_s16le).avi形式*1にエンコードしてダイジェストを比較している。
$ mencoder -ovc raw -oac pcm -ofps [フレームレート] ultrafast.avi -of avi -o ultrafast_raw.avi $ mencoder -ovc raw -oac pcm -ofps [フレームレート] slower.avi -of avi -o slower_raw.avi $ mencoder -ovc raw -oac pcm -ofps [フレームレート] max.avi -of avi -o max_raw.avi $ md5sum *raw*avi 129748d6f47f71e351e0706fa01691ca max_raw.avi 129748d6f47f71e351e0706fa01691ca slower_raw.avi 129748d6f47f71e351e0706fa01691ca ultrafast_raw.avi
どのプリセットでエンコードしたものも無圧縮にすると全て同じであることが分かる。
このファイルを再びロスレス指定でエンコードし、同じ無圧縮状態に戻してみると、当然同じものが得られるのだが、作業例は省略する。
なお、-vpreオプションでプリセットを選択しないと
[libx264 @ 0x17ee8a0]broken ffmpeg default settings detected [libx264 @ 0x17ee8a0]use an encoding preset (vpre)
のようなエラーメッセージを含んだ出力が表示され、エンコードに失敗する(libx264やFFmpegのバージョンによるかもしれない)。
MEncoder
MEncoderでは-x264encoptsにcrf=0もしくはqp=0を含めるとロスレスになる(どちらでも結果は同じ)。crfの値はmanページでは「1」からとなっているが、「0」を指定するとロスレスにできる。
$ mencoder -ovc x264 -vf harddup -ofps [フレームレート] -x264encopts crf=0 -oac pcm -of avi [入力ファイル] -of avi -o [出力ファイル].avi もしくは $ mencoder -ovc x264 -vf harddup -ofps [フレームレート] -x264encopts qp=0 -oac pcm -of avi [入力ファイル] -of avi -o [出力ファイル].avi
上の場合も、音声は無圧縮指定となる。
関連記事:
- ファイルのハッシュを計算する
- mencoderのx264エンコードオプションに関する覚え書き(2009/8/20現在)
- x264とそのライブラリを用いたFFmpeg,MEncoderの可逆(ロスレス)エンコードに関する覚え書き(前半)
使用したバージョン:
*1:無圧縮な映像と無圧縮な音声をAVIコンテナに入れたもので一般的に無圧縮AVIと呼ばれているもの