x264とそのライブラリを用いたFFmpeg,MEncoderの可逆(ロスレス)エンコードに関する覚え書き(前半)
x264コマンドとその機能を提供するlibx264ライブラリで指定できるパラメータ指定の内
- crf=0
- qp=0(FFmpegからの利用ではcqp=0)
の2つが可逆(lossless/ロスレス・以下ロスレス)エンコードを行うためのものであることが分かったのだが、オプションが2種類あるので結果が違うのではないかと思い、実際に同じ元動画からそれぞれのオプションでエンコードを試して結果を比較してみた。
ここではライブラリ(libx264)ではなく、本家のx264コマンドを用いてみた。
エンコードのコマンド行
(「crf=0」指定) $ x264 --fps [フレームレート] --crf 0 [入力ファイル] -o crf0.h264 (「qp=0」指定) $ x264 --fps [フレームレート] --qp 0 [入力ファイル] -o qp0.h264
下はヘルプの該当オプションの説明。
$ x264 --fullhelp | egrep "(crf|qp) <" -q, --qp <integer> Force constant QP (0-51, 0=lossless) --crf <float> Quality-based VBR (0-51, 0=lossless) [23.0]
結果
それぞれのオプションでエンコードした2つのファイルは
(「crf=0」指定したファイル) $ stat -c "%s" crf0.h264 5684518 (「qp=0」指定したファイル) $ stat -c "%s" qp0.h264 5684518
サイズが一致し
$ md5sum crf0.h264 qp0.h264 3c12fec2b1db624553a317bcbee1de16 crf0.h264 3c12fec2b1db624553a317bcbee1de16 qp0.h264
ダイジェスト(ハッシュ)も一致した。つまり、どちらのオプションを用いても値が0であればロスレス指定として同じように機能するということが分かった。
0以外の値を指定するときには効果が異なる
とは言え、--crfと--qpそれぞれのオプションの効果自体は別で
- --crfは映像の品質を選択してその値で固定するもの
- --qpは「Pフレームに用いられるクォンタイザ(quantizer)値」として調整するもの
という違いがあり、0以外の値を指定する場合に効果が異なる。
下はMEncoderから用いる場合の説明となる。
[引用] MPlayer/MEncoderのmanページより
CODEC SPECIFIC ENCODING OPTIONS (MENCODER ONLY) ... x264enc (-x264encopts) ... qp=<0-51> This selects the quantizer to use for P-frames. I- and B-frames are offset from this value by ip_factor and pb_factor, respec‐ tively. 20-40 is a useful range. Lower values result in better fidelity, but higher bitrates. 0 is lossless. Note that quan‐ tization in H.264 works differently from MPEG-1/2/4: H.264's quantization parameter (QP) is on a logarithmic scale. The map‐ ping is approximately H264QP = 12 + 6*log2(MPEGQP). For exam‐ ple, MPEG at QP=2 is equivalent to H.264 at QP=18. crf=<1.0-50.0> Enables constant quality mode, and selects the quality. The scale is similar to QP. Like the bitrate-based modes, this al‐ lows each frame to use a different QP based on the frame's com‐ plexity.
(「x264とそのライブラリを用いたFFmpeg,MEncoderの可逆(ロスレス)エンコードに関する覚え書き(後半)」に続く)
関連記事:
- ファイルのハッシュを計算する
- mencoderのx264エンコードオプションに関する覚え書き(2009/8/20現在)
- x264とそのライブラリを用いたFFmpeg,MEncoderの可逆(ロスレス)エンコードに関する覚え書き(後半)
使用したバージョン: