2011/10/26

x264でビットレートを制限するメリット

x264では
"--vbv-bufsize"オプションでバッファサイズ(kbit)を指定した上で
"--vbv-maxrate"オプションでバッファサイズ範囲内での最大ビットレート(kbps)を制限することが出来ます。

このオプションは主に再生機器の制限に合わせるために使用するので、PCで再生するファイルをエンコードする上では、よほど低スペックでない限り指定する必要がありません。

しかし、デジタル放送(特に地上波デジタル)を録画してエンコードする場合、適切なビットレート制限をかけることで無駄なビットの浪費を防ぎサイズを小さくする事が出来ます。


それではビットレートを制限する効果を検証していきます。
私は基本的にレートの設定をシーンが変わっても品質が一定となるようにビットが割り当てられるcrfでエンコードしています。特にアニメの場合は"--crf 20"としているのでソースからの画質の劣化を殆ど確認できません。

まず始めに、地上波放送のソース(MPEG2-TS)をBitrate Viewerで表示したものを載せます。


ビットレートが瞬間的には17150kbpsまで上がりますが、基本的には送信レートと同じ16Mbps程度で頭打ちになります。
これを"--crf 20"(と細かいオプション)でx264エンコードした物のビットレートの結果をご覧下さい。


大抵のシーンでは10Mbps以下ですが、特に前半1/3ぐらいのシーンでソースのビットレート(16Mbps)を大幅に超えた30~60Mbpsになっている事が分かります。
明らかにこのシーンに多くの容量が割かれているわけですが、MPEG2より圧縮率の良いh264で再エンコードしているので基本的にはビットレートは小さくなるはずです。何故この様なことが起きるのでしょうか。
実はこのシーンでは画面全体が激しく動き、地上波デジタルのビットレートでは不足して大量のブロックノイズが発生しています。
x264はこのブロックノイズまみれの破綻した絵を再現するべく、大量のビットを割り当てているわけです。エンコーダとしてはこの動作は正しいですが、破綻したシーンを再現するためにサイズが無駄に増大するのは好ましくありません。
そこで、オプション"--vbv-maxrate 15528 --vbv-bufsize 4313"を指定し、約15Mbps以上にはビットレートが上がらないように制限してエンコードしてみます。


正常に圧縮できるシーンには影響を与えず、破綻したシーン(制限無しで16Mbps以上となる領域)ではビットレートが制限されビットの浪費が抑えられています。
当然、ビットレートが制限されたシーンでは画質が落ちソースとの違いが判るわけですが、もとよりブロックノイズまみれの絵が多少劣化したところで殆ど影響はありません。
また、ビットレートを制限した事でサイズが342MBから206MBまで小さくなりました。ブロックノイズの再現に130MB以上浪費されていた訳です。

最後に、実際にエンコードで使用する際は多少余裕を持って放送時のレートと同程度、地上波なら16Mbpsとして"--vbv-maxrate 16000 --vbv-bufsize 16000"ぐらいでエンコードすると良いと思います。

参考にデジタル放送のビットレートを載せておきます。(おおよその値。Wikipediaより)

24Mbps :大抵の衛星デジタル無料放送局
23Mbps :NHK BS1
21.5Mbps:NHK BSプレミアム
18Mbps :BS11デジタル
16.9Mbps:地上波デジタル放送
16Mbps :放送大学
15Mbps :TwellV

動画以外も含んだ値です。
実際には音声やワンセグ、データ放送等にもビットレートが割かれるので、動画のビットレートはこれより低い値になります。

関連記事

エンコード関連記事一覧