nicolish!
CBR検証
最終更新:
Bot(ページ名リンク)
-
view
VP6におけるCBRとは?
「CBR 2passって意味無いだろwww」とか言ってる人がいたので確認してきたよ。
というか、CBRネタは次の「ひとつ上のうp主になる」で使おうとしてたので、俺の認識が間違ってたのかと不安になったんだけど。
論より証拠、以下の俺の嫁の顔を見比べて欲しい。
というか、CBRネタは次の「ひとつ上のうp主になる」で使おうとしてたので、俺の認識が間違ってたのかと不安になったんだけど。
論より証拠、以下の俺の嫁の顔を見比べて欲しい。




引き続き事実確認から。
上の結果はほぼ同じ設定で動画を圧縮した結果を切り出したもの(ちなみに、2pass圧縮の場合にキーフレームになる部分)。主だったところだけ挙げると、200kbps、全てCBR、自動キーフレームonでキー間最大フレーム数は200。ソースは言うまでも無いので割愛。解像度をオリジナルのまま、当然フィルタは皆無。
どこを変えたかというと、こんな感じ。
上の結果はほぼ同じ設定で動画を圧縮した結果を切り出したもの(ちなみに、2pass圧縮の場合にキーフレームになる部分)。主だったところだけ挙げると、200kbps、全てCBR、自動キーフレームonでキー間最大フレーム数は200。ソースは言うまでも無いので割愛。解像度をオリジナルのまま、当然フィルタは皆無。
どこを変えたかというと、こんな感じ。
| A | B | C | D | |
| エンコード | 1-pass | 1-pass | 2-pass | 2-pass |
| Prebuffer[secs] | 4 | 0 | 4 | 0 |
| Optimal Buffer[secs] | 5 | 0 | 5 | 0 |
| Max Buffer | 6 | 0 | 6 | 0 |
バッファを取ったものと取らなかったもの、1passと2pass、というわけ。マトリクスにするとこうなる。
| 1pass | 2pass | |
| バッファ〇 | A | C |
| バッファ× | B | D |
2Pass圧縮とは
2Pass圧縮の1Pass目で行なっている作業は、大きく分けて以下の2つ。
- 動画の(各時点の)圧縮難易度のラフな計算
- キーフレーム挿入位置の決定
前者は、要するに動画の動きの大きさ、情報理論的に言えば時間あたりの情報量の大きさだ。VP6のドキュメントで「Difficulty」という語を使っていたので、「難易度」で行こう。
で、その難易度に応じてキーフレームの位置を決めるわけだ。キーフレームの挿入位置は、基本的には差分フレームの大きさの和が最小になるような位置に決定されるはずだ。とすると、動きの大きな部分にキーフレームが集中する事になると考えられる。2pass圧縮した動画のキーフレームを見ていけば実際にそうなっている事は一目瞭然なので、恐らくこの推定は妥当だろう。
で、その難易度に応じてキーフレームの位置を決めるわけだ。キーフレームの挿入位置は、基本的には差分フレームの大きさの和が最小になるような位置に決定されるはずだ。とすると、動きの大きな部分にキーフレームが集中する事になると考えられる。2pass圧縮した動画のキーフレームを見ていけば実際にそうなっている事は一目瞭然なので、恐らくこの推定は妥当だろう。
CBRは本当にCBRか
で、VBRの場合は区間の難易度に応じてビットレートを振るので大きな意味があるわけだけど、CBRは全フレーム同じ圧縮率なので2passにする意味が無い、はず。CBR圧縮ならば。本当にCBRが固定ビットレートならば。
そもそも差分圧縮(フレーム間予測)というのは、キーフレーム+差分フレーム、というデータの持ち方をする事で圧縮を実現する。従って、純粋に固定ビットレート的な圧縮をしようとしたら、この圧縮方法は使えない。差分圧縮をする以上、キーフレームは絶対にデータ量が大きくなるからね。huffyuvや無圧縮AVI、mjpegなどと同じく、全フレームが完全なデータを持つ必要があるわけだ、必然的に。
画像を出した直後にサラっと触れたけど、あの画像は「キーフレームを切り出したもの」。VP6の2pass圧縮にはキーフレームが、現に存在するらしい(あくまでVirtualDubによれば)。勿論、全フレームがキーフレームとかそういう意味じゃなく、VBRの時と同じで、特定のフレームのみがキーフレームになっている。
(GOMプレイヤーでグリグリしてピンクの四角が出るか試したけど出なかった、AVIだと割とグリグリに強いのかな)
固定ビットレート動画圧縮は差分圧縮ではありえず、従ってキーフレームは持ち得ない。キーフレームを持っている、という時点で、VP6のCBR圧縮は完全固定ビットレートではない、といえるんじゃないかな。
ちょっと証拠としては弱いから、もう少し仮説を積み上げてみる。
(本当は瞬間ごとのビットレートを見るべきなんだろうが、それをするツールというのを残念ながら知らないのでアレ。あと勿論、VP6のバイナリデータ構造とかを見れば一目瞭然なんだろうけど、わかんないのでパス)
そもそも差分圧縮(フレーム間予測)というのは、キーフレーム+差分フレーム、というデータの持ち方をする事で圧縮を実現する。従って、純粋に固定ビットレート的な圧縮をしようとしたら、この圧縮方法は使えない。差分圧縮をする以上、キーフレームは絶対にデータ量が大きくなるからね。huffyuvや無圧縮AVI、mjpegなどと同じく、全フレームが完全なデータを持つ必要があるわけだ、必然的に。
画像を出した直後にサラっと触れたけど、あの画像は「キーフレームを切り出したもの」。VP6の2pass圧縮にはキーフレームが、現に存在するらしい(あくまでVirtualDubによれば)。勿論、全フレームがキーフレームとかそういう意味じゃなく、VBRの時と同じで、特定のフレームのみがキーフレームになっている。
(GOMプレイヤーでグリグリしてピンクの四角が出るか試したけど出なかった、AVIだと割とグリグリに強いのかな)
固定ビットレート動画圧縮は差分圧縮ではありえず、従ってキーフレームは持ち得ない。キーフレームを持っている、という時点で、VP6のCBR圧縮は完全固定ビットレートではない、といえるんじゃないかな。
ちょっと証拠としては弱いから、もう少し仮説を積み上げてみる。
(本当は瞬間ごとのビットレートを見るべきなんだろうが、それをするツールというのを残念ながら知らないのでアレ。あと勿論、VP6のバイナリデータ構造とかを見れば一目瞭然なんだろうけど、わかんないのでパス)
バッファ
ここからは仮説が入ってくる。仮説の妥当性をあんまり検証してないけど、作業時間が午前4時ってことでカンベンしてくれ。
最初に考えたのはこんな事。「CBRは、シーンごとのビットレートを一定に保っているのではないか?」。H.264に似たような設定があったはず。これならば、例えばキーフレームが10秒おきにあったとすれば、「10秒ごとの平均ビットレート」は確実に一定に保たれる。
最初に考えたのはこんな事。「CBRは、シーンごとのビットレートを一定に保っているのではないか?」。H.264に似たような設定があったはず。これならば、例えばキーフレームが10秒おきにあったとすれば、「10秒ごとの平均ビットレート」は確実に一定に保たれる。
で、ここまで考えたところで思いついた。
ここで問題。10秒で2000kb以下、というのは保証されてるけど、1秒幅で見ると常に200kb以下ってわけじゃなく結構ビットレートにバラつきがある。そんな動画を、200kbpsの回線で引っかかる事なく(再生中に読み込み待ちをする事無く)見るにはどうしたらいいだろう?
答え。10秒分データを先に読み込んでおく。10秒以内の幅でのビットレートのばらつきは、この10秒の余裕に吸収される。
この考え方は、要するにバッファのこと。バッファというのは本来回線のノイズなどの不安定さに対処するためのものなわけだけど、同時にデータ自体のビットレートをバッファの許す範囲内で変える事で、CBRデータとして扱える範囲内で微妙にVBR的な処理をしているのではないか?というのが俺の仮説で、それを検証してみたのがさっきの結果。
バッファを取った場合のデータで、最大バッファ長は6秒。どんだけ瞬間ビットレートが変動しようと、6秒毎の平均さえ帳尻を合わせておけば、その分はバッファが吸収してくれる。
で、この仮説が正しいならば、キーフレームの位置は圧縮効率に当然影響を与えるわけで、2passは意味がある、というのは自明なこととなる。
はず。
ここで問題。10秒で2000kb以下、というのは保証されてるけど、1秒幅で見ると常に200kb以下ってわけじゃなく結構ビットレートにバラつきがある。そんな動画を、200kbpsの回線で引っかかる事なく(再生中に読み込み待ちをする事無く)見るにはどうしたらいいだろう?
答え。10秒分データを先に読み込んでおく。10秒以内の幅でのビットレートのばらつきは、この10秒の余裕に吸収される。
この考え方は、要するにバッファのこと。バッファというのは本来回線のノイズなどの不安定さに対処するためのものなわけだけど、同時にデータ自体のビットレートをバッファの許す範囲内で変える事で、CBRデータとして扱える範囲内で微妙にVBR的な処理をしているのではないか?というのが俺の仮説で、それを検証してみたのがさっきの結果。
バッファを取った場合のデータで、最大バッファ長は6秒。どんだけ瞬間ビットレートが変動しようと、6秒毎の平均さえ帳尻を合わせておけば、その分はバッファが吸収してくれる。
で、この仮説が正しいならば、キーフレームの位置は圧縮効率に当然影響を与えるわけで、2passは意味がある、というのは自明なこととなる。
はず。
細かな事
調べてみたけど、XviDとかの「平均化区間」ってのに近いのかなぁ。
1passの方が2passより綺麗なのは、つまりこのシーン(冒頭10秒ちょい、最初のきしめんの前の「♪瞳閉じて~」)は比較的「簡単な」シーンって事だろう。一瞬画面が止まるから、動きまくる動画全体から見ると「難易度」が低いシーンだといわれても納得のいくところ。難しいシーンを切り出せば1passの方が汚いはずだが、面倒なのでパス。
ちなみにファイルサイズだが、予想通り一番安定してないのが1pass、バッファなし。200kbps指定のところを273kbpsになってるので、36%の超過。2pass組は1割ほどの超過に収まっていて、1passでバッファありの場合15%超過ってところ。
Peak Bitrateが影響するに決まってるのに、その辺の検証を忘れた。けど反証する人が出ない限りもういいや。どうせCBRなんて使わんし。
1passの方が2passより綺麗なのは、つまりこのシーン(冒頭10秒ちょい、最初のきしめんの前の「♪瞳閉じて~」)は比較的「簡単な」シーンって事だろう。一瞬画面が止まるから、動きまくる動画全体から見ると「難易度」が低いシーンだといわれても納得のいくところ。難しいシーンを切り出せば1passの方が汚いはずだが、面倒なのでパス。
ちなみにファイルサイズだが、予想通り一番安定してないのが1pass、バッファなし。200kbps指定のところを273kbpsになってるので、36%の超過。2pass組は1割ほどの超過に収まっていて、1passでバッファありの場合15%超過ってところ。
Peak Bitrateが影響するに決まってるのに、その辺の検証を忘れた。けど反証する人が出ない限りもういいや。どうせCBRなんて使わんし。