Date

Out of memory errors with the Windows Media Format SDK というエントリーがブログ Windows Media and DirectShow tips, gotchas and code bits にアップされていた。

ポイントとしては、以下のようなところ。

  1. 32ビットのWindows OSでアプリケーションが確保できるメモリは最大2GB。
  2. Media Format SDK は自身のヒープを作成し、それが2GBを超えないように注意しながらメモリを使う。
  3. ところがエンコーディングアプリケーションのフットプリントを合わせると、(プロセス全体で)2GB超えちゃう。
  4. VC 1 codec はフレームの前後を参照するのでHDビデオをエンコードすると大量にメモリを消費する。30fpsで5秒だと1.2GB。
  5. Media Format SDKはエンコーディング前に利用可能メモリを確認し、ヒープを確保する。CRTのような他のヒープは管理しない。
  6. 空きメモリがあってもヒープにフラグメンテーションが発生している場合もOut of memoryとなる。CPUに負荷がかかってる状態ではOSはヒープコンパクトをしない。
  7. 結 果 。 Out of memory になってしまう。

で、対策。

  1. プロセスを分割する。
  2. x64プラットフォームを使用する。
  3. エンコーディング設定を見直して消費メモリを抑える。→ バッファサイズを1秒にする、キーフレームの間隔を2,3秒にする。

HDビデオを扱うなら x86 環境はかなり厳しい。x64プラットフォームに移行するのがベストか。前後のフレームを参照するようなcodecだと、非圧縮の状態でフレームをメモリに置かなければならないのであっという間に2GB制限にひっかかってしまう。編集となると更にレイヤーの数だけメモリが消費されるから大変だな…


Comments

comments powered by Disqus