2

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変換に依存しません。

それはどのように行われますか?

4

3 に答える 3

1

何年も前から存在しているGPLのスクリーンキャストアプリであるCamStudioのソース(商業的にそして後でopen-srcd)は役に立つかもしれませんか?

http://sourceforge.net/project/showfiles.php?group_id=131922

VNCクライアントの内臓も調べることをお勧めしますが、おそらく非常に単純です(スクリーンショットを取得してから、前回のキャプチャ以降に変更されたタイルをjpgで取得するだけだと思います)。

CPUが多すぎる場合は、オンザフライエンコーディングのエンコーダーとしてWMV9を使用しないことを検討してください。たぶん、HyperCamで使用されている古い、効率の低いコンプレッサー(MS RLEなど)を使用し、後でWMVに圧縮しますか?MS RLEは、少なくともWin2000以降のデフォルトのインストールであると私は信じています: http ://wiki.multimedia.cx/index.php?title = Microsoft_RLE

CamStudioのロスレスコーデックはGPL(上記と同じリンク)であり、かなり優れた圧縮を提供し(ただし、インストーラーにdllをバンドルする必要があります)、その場で使用できますが、最新のすべてのシステムで高圧縮でうまく機能します。

于 2008-10-21T11:31:26.413 に答える
0

BB FlashBackライブラリをチェックアウトしましたか?

私も同様の調査を行っており、BBFlashBackライブラリの評価を開始したばかりです。

外部の依存関係やインストールのフットプリントについてはよくわかりません。インストールする必要のある独自のコーデックがあるようですが、コーデックのインストールは、公開されたBBFlashBackAPIによって処理できます。

ライセンスの制限があることに注意してください(ライセンスキーの実行時設定、...)

ライセンスダウンロードをコミットする前にAPIを評価したい場合は、SDKから電子メールでCHMを送信できます。

私が評価していること:WPFビューの適切なキャプチャマウスカーソルの追跡保存されたムービーのサイズ独自のコーデックなしで保存されたムービーを表示する方法(つまり、SWFエクスポート)

-バットガー

于 2008-12-29T18:29:36.410 に答える
0

Win32コーディングを行ってから何年も経ちましたが、私の知る限り、形式としてのWMFは基本的にGDIコマンドとそのパラメーターのリストであり、エンコードする方がはるかに効率的である理由を説明しています...

おそらく、最上位の GDI コンテキストにフックして (リモート デスクトップと同じように)、呼び出された GDI コマンドをキャプチャする必要があります。WMF 出力 GDI コンテキストを作成する方法がいくつかあることを覚えているようです。つまり、何らかの方法で呼び出しを委任できる可能性があります。

私はここで推測していますが、WindowsプロジェクトのTightVNC / QuickVNCで上記のサンプルコードを見つけることができるかもしれません.

于 2008-09-18T01:42:08.637 に答える