試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

x264とそのライブラリを用いたFFmpeg,MEncoderの可逆(ロスレス)エンコードに関する覚え書き(後半)

x264とそのライブラリを用いたFFmpeg,MEncoderの可逆(ロスレス)エンコードに関する覚え書き(前半)」の続き。

FFmpegMEncoderからの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では-x264encoptscrf=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

上の場合も、音声は無圧縮指定となる。

関連記事:

使用したバージョン:

  • libx264 94, 104(自前ビルド)
  • MPlayer/MEncoder r31086(libx264 94にリンク), r32011(libx264 104にリンク・自前ビルド)
  • FFmpeg r22960

*1:無圧縮な映像と無圧縮な音声をAVIコンテナに入れたもので一般的に無圧縮AVIと呼ばれているもの