1分30秒の動画再生を考える

  • 動画(1280x720)
    非圧縮AVI6.95 GB(7,472,661,012 バイト)100%
    MP430.0MB(31528283Bytes)0.49%
    MPG-II20.8 MB(21,827,584 バイト)0.34%
    MPG-II(音声なし)19.4 MB(20,359,168 バイト)0.31%
    MPG-I(半分サイズ)13.8 MB(14,497,792 バイト)0.22%
  • 音声のみ
WAV15.1 MB(15,881,760 バイト)100%
MP31.37 MB(1,440,738 バイト)9%

画像に変換(動画は29FPS)

  • AVIからBMPに変換して2697枚の画像になった
  • 2697枚 / 29FPS = 93秒 = 約90秒の動画と一致
    • 1枚あたり0.034秒で29FPSの動画ができるハズ
フォーマット総枚数1枚あたりのサイズサイズ総量圧縮率
非圧縮AVIx16.95 GB (7,472,661,012 バイト)100%
BMP(音声なし)x 26972.63 MB (2,764,854 バイト)6.94 GB (7,456,811,238 バイト)100%
BMP(リサイズ4%)x 2697108 KB (110,646 バイト)284 MB (298,412,262 バイト)100%

動画をリサイズする

  • 1280x720の解像度を256x144の実用サイズだが、かなり小さいサイズにする
  • これで高速性とファイルサイズの小ささを確保できるか?
フォーマット総枚数1枚あたりのサイズサイズ総量圧縮率
BMP(リサイズ4%)x 2697108 KB (110,646 バイト)284 MB (298,412,262 バイト)100%
BMPをZIP圧縮x 1164 MB (172,859,929 バイト)57%
PNGフォルダx 26979~91KB144 MB (151,703,806 バイト)50%
PNGをZIP圧縮x1145 MB (152,210,893 バイト)50%
PNGを7z圧縮x1129 MB (136,191,909 バイト)45%
M4Vx17.59 MB (7,967,835 バイト)2%

AVIをBMPに変換するとほぼぴったり同じサイズ。
PNGフォルダをZIP圧縮すると微妙に増えた。もともとPNGが圧縮されてるので似たようなアルゴリズムではこれ以上減らない
フルサイズの音付きMP4が30MB程度なのに4%の画面サイズのPNG連番が150MB(5倍!)ってMP4すげえ!

音無しのM4Vだと圧縮率2%!!!一体どんな技術なんだ!?

ざっくり見て1秒間29コマ、1.6MB程度 、かなり効率が悪い

  • 1コマ ((145MB) / 2967枚 ) = 55KB
  • 1秒 = 55KB * 29コマ = 約1.6MB
    • ちなみにM4Vは0.082MB(84KB)

じゃあ利用価値はないのか?

  • M4Vのいいところ
    • M4Vなどはゲームで使われることは想定外のはずなのでアルファチャンネルの対応などが出来ない
    • M4Vはキーフレームからの差分データとなるので再生開始フレームの頭出しに時間が掛かる(GOP構造)
    • M4Vはデコードに時間がかかるのでリアルタイムで処理すると重たくなる
    • Cで使えるいい感じのデコーダーがないので画像を取り出してテクスチャ化するとかしにくい
  • PNGムービーのいいところ
    • 自前のPNGムービーならアルファチャンネルを含んだデータを作ることができる
    • PNGムービーは全フレームがキーフレームなので頭出しが簡単、処理時間も食わない
    • PNGムービーはデータ構造が単純なのでデコードが速いので軽い
    • 中身がPNGなのでデコーダーを好きに作れる、テクスチャ化も余裕
    • アルファチャンネル情報をもったゲーム画面を1枚ずつPNGデータとして出力することでアルファチャンネルムービーが作れる!
    • プログラムでムービーを作ることができる

つまり

  • たれながすならmpeg!
  • ゲームで利用したり加工したりするならpngムービー!

bsf形式などmpegデータを簡単に扱えるAPIがあるコンシューマーゲーム機は最強。
RenderWareなどのアルファチャンネルムービー機能を持つミドルウェアもいい。
金もプラットフォームもなければ自作PNGがオススメ!