1

前の質問のフォローアップとして、Direct3DDevice のバックバッファをサーフェスに保存できます。

DirectX SDK で D3DXSaveSurfaceToFile を既に見つけましたが、正常に動作します。しかし、得られた曲面をAVIファイルに記録したい。

AVIFile リファレンスも見つけましたが、それらは DirectX サーフェスと完全に互換性がないことは明らかです。

この問題にアプローチする最善の方法は何でしょうか? HDC を取得する GDI+/MVC ベースのソリューションをいくつか見てきましたが、それらは論外です。また、AVIFile が期待するデータの種類と、それを D3DSurface から抽出する方法もわかりません。

お知らせ下さい!:)

編集:

後処理もオプションです。D3DXSaveSurfaceToFileInMemoryを使用して、ここで指定したさまざまな形式のサーフェス データをメモリにキャプチャできます。その後、このデータを圧縮してディスクに保存できます。

データをどのように圧縮すればよいですか? どのように保管すればよいですか?タイムスタンプを一緒に保存しますか? 記録後、生成されたデータをどのように AVI ファイルに変換すればよいですか?

4

1 に答える 1

2

このリンクのソースコードは、その方法を示しています。

http://gpalem.web.officelive.com/SimulationRecording.html

編集:まあ、あなたはそのリンクされたコードのように正確に何かをする必要はありません。D3DSurfaceがあるので、それをロックしてビットを取得し、CAviFile :: AppendFrameUsualに渡すことができます...その形式を変更する場合は、D3DXLoadSurfaceFromSurfaceを使用します。リンクが完璧な解決策であるとは言いませんでしたが、フレームをAViファイルに書き込む方法を示しています。

Edit2:私はあなたの編集に答えなかったので、私はすべきです。まず、非圧縮で動作するようになるまで、圧縮を気にしないでください。圧縮は正しく行うには非常に複雑であり、さまざまなD3DXSurfaceコピー機能を使用するだけでは適切な圧縮を行うことはできません。彼らはあなたが求めている種類の圧縮をサポートしていません。D3DXは3Dレンダリング用であり、ビデオ圧縮用ではありません。

ビデオ圧縮の場合は、DirectShowを使用するのが最善です。必要なコンプレッサーを追加するだけです。ただし、これは、グラフを作成できる「ソースフィルター」を作成する必要があることを意味します。DirectShowは使いやすいものではありませんが、非常に強力です。「ソースフィルター」の記述に関しては、WindowsSDKの「プッシュソース」の例を確認できます。ただし、取得するデータを取得するように調整する必要があります。

余談ですが、私の元の編集をさらに進めると、より多くのD3D9呼び出しをインターセプトすることで、そのコードをそのまま使用できます。SetRenderTarget呼び出しをフックすると、そこに好きなレンダリングターゲットを挿入して、以前にリンクされたコードを直接使用できます...

于 2010-09-27T10:19:26.843 に答える