Out of memory errors with the Windows Media Format SDK というエントリーがブログ Windows Media and DirectShow tips, gotchas and code bits にアップされていた。
ポイントとしては、以下のようなところ。
- 32ビットのWindows OSでアプリケーションが確保できるメモリは最大2GB。
- Media Format SDK は自身のヒープを作成し、それが2GBを超えないように注意しながらメモリを使う。
- ところがエンコーディングアプリケーションのフットプリントを合わせると、(プロセス全体で)2GB超えちゃう。
- VC 1 codec はフレームの前後を参照するのでHDビデオをエンコードすると大量にメモリを消費する。30fpsで5秒だと1.2GB。
- Media Format SDKはエンコーディング前に利用可能メモリを確認し、ヒープを確保する。CRTのような他のヒープは管理しない。
- 空きメモリがあってもヒープにフラグメンテーションが発生している場合もOut of memoryとなる。CPUに負荷がかかってる状態ではOSはヒープコンパクトをしない。
- 結 果 。 Out of memory になってしまう。
で、対策。
- プロセスを分割する。
- x64プラットフォームを使用する。
- エンコーディング設定を見直して消費メモリを抑える。→ バッファサイズを1秒にする、キーフレームの間隔を2,3秒にする。
HDビデオを扱うなら x86 環境はかなり厳しい。x64プラットフォームに移行するのがベストか。前後のフレームを参照するようなcodecだと、非圧縮の状態でフレームをメモリに置かなければならないのであっという間に2GB制限にひっかかってしまう。編集となると更にレイヤーの数だけメモリが消費されるから大変だな…
0 コメント:
コメントを投稿