Windows Media Format SDKを使用して、デスクトップをリアルタイムでキャプチャし、WMVファイルに保存しています(実際、これは私のプロジェクトを単純化しすぎていますが、これは関連する部分です)。エンコードには、Windows Media Video 9 Screenコーデックを使用しています。これは、画面キャプチャに非常に効率的であり、コーデックがWindows Media Player 9ランタイムに含まれているため( Windows XP SP1)。
GDI関数を使用してBITMAPスクリーンショットを作成し、それらのBITMAPをエンコーダーにフィードしています。ご想像のとおり、GDIでスクリーンショットを撮るのは遅く、画面カーソルが取得できません。これを手動でBITMAPに追加する必要があります。私が最初に取得するBITMAPはDDBであり、エンコーダーが理解できるようにそれらをDIBに変換する必要があります(RGB入力)。これにはさらに時間がかかります。
プロファイラーを起動すると、時間の約50%がエンコーダーであるWMVCORE.DLLに費やされていることがわかります。もちろん、エンコーディングはCPUを集中的に使用するため、これは予想されることです。
重要なのは、SDKに付属しているWindows Media Encoderと呼ばれるものがあり、目的のコーデックを使用して、よりシンプルでCPUに優しい方法で画面キャプチャを実行できることです。
WMEはWMFに基づいています。これはより高いレバーライブラリであり、.NETバインディングもあります。回避しなければならない不要な依存関係が発生するため、プロジェクトで使用できません。
WMEがサンプルデータをWMVエンコーダーに供給するために使用する方法について質問しています。エンコーディングは、WMFを使用する私のアプリケーションで行われるのとまったく同じようにWMEで行われます。WMEは、ビデオデータをエンコーダーに供給するためのはるかに効率的な方法を備えているため、私のアプリケーションよりも効率的です。遅いGDI関数やDDB->DIB変換に依存しません。
それはどのように行われますか?