nicolish!

差分圧縮、キーフレーム

最終更新:

nicolish

- view
管理者のみ編集可

差分圧縮、キーフレーム


01.差分圧縮

動画圧縮の基本アイデアは
「ある瞬間の映像と、次の瞬間の映像はだいたい同じ」
という事。

たとえば、森の中にいるシーンの次の瞬間は
やっぱりだいたい森の中にいる
いきなり砂漠にいたりはしない

特に、カメラが静止している場合
背景は一定で登場人物だけが動く事になる
つまり、画面の大部分は動かない

カメラが動いていても同じ
背景の動きはゆっくりだから
やっぱりいまの映像は直前の映像と似たものになる

動いているものも、瞬間移動はしないわけで。
ちょっとずつ位置を変えていくわけだから
ある瞬間の位置は、直前の位置と非常に近い

だから、毎フレームごとに絵を持つ代わりに
直前のフレームとの差だけを持ってればラクができる
勿論、基準になる一枚だけは完全な絵が必要だけど

ああ、それと、圧縮の性質上
動きの大きい映像ほど圧縮効率が悪くなる
差分が大きくなるからね

画面全体が明滅するロックコンサートなんかは最低だね
ゲームだと、移動シーンなんかが非常に重い
会話シーンは文字しか動かないので軽い
全編会話なエロg…ADVは極めて圧縮効率がいい

こんな感じでいったんまとめ
大雑把な説明をしちゃったけど、本当はもっと難しい
もっと知りたい人はwikipediaの「フレーム間予測」辺りが
とっかかりとしては良いかもしれない。

ここまでのまとめ

  • ある瞬間の映像と、次の瞬間の映像はだいたい同じ
  • その瞬間の映像全体を持つのではなく、直前のフレームとの差分だけを持つ事で、フレームごとのデータ量を小さくできる
  • 動きの大きな映像ほど圧縮効率が悪い


02.キーフレーム

差分を持つ事の欠陥の話

さて、
  • 最初の一枚の画像(1フレーム目)
  • 前のフレームとの差分データ
だけで映像を作ったとしよう

差分を取る方法は
直前の画像が分かって、差分も分かれば
いまの画像が分かる、という方法だ

つまりこれは、
直前の画像がわかんないといまの画像が分からない
という事を意味する

となるとどういう問題が起きるか?
頭出しに弱くなる。好きな位置から再生を開始できない。

たとえば10分のところから再生したい、と思っても、
いきなりそこからはじめる事が出来ない。
9分59秒の画像が分からないからね

9分59秒の画像も、9分58秒の画像がわかんないと計算できない
結局、0秒、1フレーム目から順番に画像を計算していかないといけない

これは果てしなく不便そうだよね
ニコニコに投稿するとどうなるだろう?

スライドバーをいじると、滑らかに動かない
ちょっと戻そうとしても、最初からしか見られない
静止画のBGM動画とかでよくあるね

じゃあどうするかというと、妥協する
差分じゃなくて完全な画像を持つフレーム
たまに挟み込むわけだ
このフレームをキーフレームと呼ぶ

キーフレームが5秒毎にあれば
0秒、5秒、10秒…と、5秒おきのポイントから再生できる
まあ、この程度までできれば悪くないね

キーフレームを持つ欠点。
差分を持つよりデータが大きくなる
つまり、キーフレームが多いと圧縮効率が悪くなる

ここまでのまとめ

  • キーフレームとは、差分ではなく完全な画像を保持するフレームの事
  • 再生開始できるのは、キーフレームのある瞬間からだけ
  • キーフレームを増やすと圧縮効率が落ちる

03.キーフレームと2-pass

圧縮効率をなるべく落とさず
キーフレームはなるべく多くしたいよね

キーフレームでないフレームは、差分データで出来ている
だから、前の瞬間からの変化が大きいほど、そのフレームのデータが大きくなる

極端な例で行こうか
直前のフレームが真っ黒で、次の瞬間絵が表示されたとする
この場合、絵が表示された瞬間の「差分」は、殆ど絵そのものになる

絵そのものを持ってるに等しいわけだから
ここをキーフレームにしてもデータは大きくならなさそうだね
そういう方針でいこうか

つまり、キーフレームはなるべく映像が大きく変わる瞬間に挟む事にする
実際の動画で言えば?
そう、いわゆるシーンチェンジの瞬間が該当する。
(注記:実際にはこれだけでなく、そのシーンの圧縮難易度なども影響します)

ただ、これには問題がある
「その瞬間は、動画全体の平均から考えて大きな画像更新か?」
これに答えるには、動画全体を知らないといけない

たとえば全体の10%くらいが一瞬で更新される瞬間があったとする
この瞬間をキーフレームにすべきか?

3%くらいの小さな変化ばっかの中にこの瞬間があったら
まあ間違いなくキーフレームにすべきだね
でも、20%くらいの大きな変化が頻繁に起こる動画だとそうはならない

動画圧縮は前のほうから時間順に進んでいく
普通にやってたら全体像を把握する事はできない
じゃあどうしよう?

先に全体を軽く眺めて、どんな感じになってるか見当をつけておけばいい
見当がついたら、再度最初から進めて、予め決めた瞬間をキーにして圧縮していく

この「見当をつける」段階が、動画圧縮の1-pass目
実際に圧縮していくのが2-pass目

圧縮を2-passで行なうと、全体の見当がついている分圧縮効率が良い
だから、同じ容量ならばより大きな情報量を詰め込める
要するに画質が向上する

ここまでのまとめ

  • キーフレームは、映像の変化が大きい瞬間に挿入すると効率がよい
  • 動画圧縮を2-passで行なう場合、1-pass目で「どこにキーフレームを挿入すると効率が良いか?」の計算を行なう
  • そのため、2-pass圧縮は圧縮効率がよい

04.可変ビットレート

基本的なことを説明し忘れてました
サーセン

ここまでやったように、映像の特徴によって
そのフレームで持つデータを決めていくと、ひとつ問題が起きる

時間によってデータが大きかったり小さかったりするんだね
ビットレートが一定しない。
大きな変化のあるシーンでビットレートが一時的に大きくなる

こういうのを、可変ビットレートと呼ぶ
VBR(Variable Bit Rate)と呼ぶことが多い
逆に、一定の場合はCBR(Constant - )
ABRというのもあるけど、これはVBRの一種

VBR圧縮の場合、指定するのは「平均ビットレート」になる
ある瞬間は1KBpsで、ある瞬間は500kBpsかもしれないけど
動画全体としては300kBpsになるように、みたいな指定
だから実際は目標サイズだけを決めているのに等しい

ストリーミングの場合、CBRの方が望ましいと言われる事もある
けど、圧縮効率があまりに違うので、みんなVBRを使うのが現状

VBR圧縮の欠点は、貧弱なPCや回線で再生した場合に
稀に同期がずれる場合がある事
データ量に加え、再生時の負荷も変わってくるからね

映像をCBRで圧縮する時は、全体像が関係ない
つまり、1-passと2-passでの差があまり無い
裏を返せば、VBRで圧縮する利点を活かすなら2-pass、ともいえる

1-passでVBRをすると、行き当たりばったりにならざるを得ない
だから、圧縮効率の低下だけでなく
最終的な出力サイズが相当ブレる。ぶれぶれぶれぶれ。
こっちの側面からも2-passを推奨したい

うーん、ビットレートについて書いた時にやるべきだったね
すっかり忘れてた…
そんな感じでいったんまとめ。

ここまでのまとめ

  • 時間ごとにビットレートが変化する事をVBR(可変ビットレート)という
  • 常にビットレートが一定な事をCBR(固定ビットレート)という
  • VBRは圧縮効率に優れ、その真価は2-pass圧縮であらわれる

05.キーフレーム・実践編

ニコニコは教室で起こってるんじゃない
現場で起こってるんだ
実際の現場で見てみよう

まず、キーフレームが少ない動画
「作業用BGM」からいくつか拾えば簡単に見つかると思う
映像の変化に乏しい(静止画)事はすぐにわかると思う

このシリーズの1,2も、実はキーフレームが少ない
3からキーフレームの量を増やしたので
シークがしやすくなってると思う

実際にキーフレームを見てみようか
適当な動画をAviUutlかVirtualDubで開いてみよう
他の動画編集ソフトの人は適当に考えてくれい
2-passでVP6エンコした直後のAVIファイルが分かりやすいかな

AviUtlならば
編集>基本機能>次のキーフレームに移動
でキーフレームに飛べる

VirtualDubの場合は
移動>次のキーフレーム
あるいはShift + →
でキーフレーム間の移動

なんとなくシーン変化の大きい瞬間に
キーフレームがあるのが分かると思う
ある瞬間をキーフレームにしたい場合は
手動で指定する事もできる

いちいち手動じゃやってられないね
設定でキーフレームを増やす方法を見よう
これはVP6コーデックの設定画面で行なう

いじるのはGeneralタブの''Max Frames Btw Keys''。

Max Frames Between Keys、訳せば
キーフレーム間の最大フレーム数
例えば100にすると、100フレームに一度は必ずキーフレームが入る
何秒に相当するかはフレームレートから計算できるね

シークのしさすさを考慮しないなら、大きくすると圧縮効率が上がる
小さくすればシークがしやすい動画になる
fpsの10倍、10秒に一度あたりが良いと言われてるようだけど、好みの問題かな

特に静止画像を使う動画の場合は
この値を適切に設定しないと、シークバーが機能しなくなる
悪い「作業用BGM」みたいになるわけだ

全体のまとめ

  • 動画は、差分データだけを持つ事で圧縮を実現している
  • 差分ではなく完全データを持つフレームをキーフレームと呼ぶ
  • キーフレームが少ないと不便、多いと圧縮効率が悪い
  • キーフレームの位置を最適にするにはVBRでの2-pass圧縮が有効
  • Max Frames Btw Keysでキーフレーム頻度を調整できる
記事メニュー
目安箱バナー