固定ビットレートなのにビットレートが上下する?
動き予測のしくみ
さて映像比較の記事で、CBR 1,000kbpsでエンコードしているにも関わらず、コマによってビットレートが違っていたのにお気づきだろうか?
そう一応常に1,000kbpsを消費しているとしているが、キーフレームは画面全体をデータ化しているため、瞬間的に1,000kbpsを越す場合がある。また動いた部分が少ないと、データが少なくて済むため1,000kbpsを大幅に割り込むこともある。
これを解明するのが、MPEGの動き予測と差分データだ。DivXもWMVもほぼ同じようなしくみを使っているハズだ。
たとえばこんな映像。各コマの間隔は1/30秒だ。テレビは1秒間に30コマの映像を順次表示していて、1/30秒の1コマの映像を「フレーム」と呼んでいる。
エンコーダは、直前のコマと現在のフレームを見比べ、画面中を動いているものに着目する。イラストの場合、(1)と(2)の車の動きから、(3)の車の位置が予測可能だ。
(3)を描画する際には、(2)の車の画像を予測位置にコピー&ペーストして処理をごまかす(笑)。そして元あった車の背景のみを新規に描画するというわけだ。単純だけど、実に素晴らしい技術だ。
実際にはエンコーダ内部で、こんなことが行なうわれている。
まずは画面を縦横16×16ピクセルに分解、
ブロックを拡大したのが次のイラストだ。
同じ形をしたブロックが回りにないかを探し出すのだ。薄い水色の範囲が、仮想のエンコーダの動き検索範囲。この範囲は、エンコーダによってまちまちだが、範囲を調整できるエンコーダもある。こうして周囲に同じ形をしたものがあると、「このブロックは右に12ピクセル、下に10ピクセル移動した」という(セル番号とベクトル)情報だけを記録するのだ。画像自体はコピー&ペーストである。こうすることで、映像ファイルに記録するデータを極力少なくするのだ。VBRの1パス目では、このような映像チェックも行なうわれており、ビットレートの稼ぎどころを検知する。
飛行機が飛んでいく様子を想像してみて欲しい。若干小さくなったり見え方が変わっていくが、1/30秒後の次のフレームは、飛行機の大半の映像が流用できるでしょ。
ただ理論どおりに行なうかないのが世の中の常。車が急加速したり、UFOの瞬間移動光線を浴びて次のコマではなくなってしまう場合だってある。
そんなときは、3段構えの予測データとの差分のみをデータ化して、その場をしのぐのだ。
中段は予測と完全位置した場合だ。動き情報のみを記録すれば、車の形のデータをファイルに保存する必要はない。上段は予測とほぼ一致している(おそらくアクセルを緩めたか何かだ)ので、動き情報に加え輪郭部分のセルの予測と違う映像のみをセル単位で記録する。
下段はバックミラーにパトカーが見え、急にアクセルを踏んだときだろう。予測とかなり外れてしまっているので、広い範囲を描き直す必要があり、大量のデータを記録する(場合によっては動きデータを無視してキーフレームにすることもあるかも?)。
このように差分データを見つけては、ムービーのデータにしているため、フレームごとにデータ量がかなりかわってくるのだ。これがCBRでも、コマごとにビットレートが異なってくる理由。
VBRの場合は、1パス目で映像全体の動きを検査している。つまり2パス目のエンコードでは、数フレーム後に激しいシーンが来て予測が大幅にズレることが分かるので、そんなときはキーフレームを追加して画面全体をデータ化してやる。これで予測の誤差をカバーできるのでキレイな映像となる。考えた人は、頭いいね。
ところがCBRは「あっ!予測が外れた! うわわっ!次のコマもこんな展開かよっ!予測できネー!」となってしまい、過去に入れたキーフレームとの差分データの誤差がどんどん溜まりまくり、映像が劣化する原因になる。
(次ページへ続く)
この連載の記事
-
第6回
ゲーム・ホビー
縞シマノイズを完全消去!【インターレース解除編】 -
第4回
ゲーム・ホビー
ビットレートで画質を調整! CBRの秘密!【固定ビットレート編】 -
第3回
ゲーム・ホビー
表示サイズを変えて動画を軽くするテク【画面リサイズ編】 -
第2回
ゲーム・ホビー
重すぎるムービーをシェイプアップ【画質レベル編】 -
第1回
ゲーム・ホビー
まずは動画の構造について教えるぜ!【コーデック編】 -
ゲーム・ホビー
エンコードテクニック虎の巻 - この連載の一覧へ