d3d9.dll IDirect3DDevice9
メソッドをフックすることで、Direct3D アプリケーションの挿入に成功しました。
私がやろうとしているのは、アプリケーションの出力の AVI を記録することです。
Video1、XVID などのさまざまなコーデックを使用して、すべてのフレームで適切な AVI ファイルを既に生成できますが、 フレーム レートが正しくないように見えることが問題です (元のアプリケーションの表示と比較して、ビデオがぎくしゃくしすぎたり、速すぎたりします)。
私がやっていることは基本的に次のとおりです。
ビデオの録画がオンの場合は、通話
GrabFrame
の前にIDirect3DDevice9::Present
通話してください。GrabFrame
基本的に、フレームバッファデータを取得してビデオフレームとして追加する「正しい時間」にあるかどうかのチェックで構成されています。以下は、一般的なコード構造です。
(コードチェックとCOMptrのリリースは省略)
LARGE_INTEGER 今、min_time; QueryPerformanceCounter(&now); min_time.QuadPart = _lastFrameTime.QuadPart + (_videoRate * _perfFreq.QuadPart); if ( (_lastFrameTime.QuadPart == 0) || (now.QuadPart >= min_time.QuadPart) ) { CaptureBackBuffer(&pBackBuf); LPD3DXBUFFER pD3DXBuf; SaveBackBufferToMemDIB(&pD3DXBuf); _pAVIVideo->GrabFrame(pD3DXBuf->GetBufferPointer()); _lastFrameTime.QuadPart = now.QuadPart; }
次_perfFreq
のように初期化されます。
QueryPerformanceFrequency(&_perfFreq);
_perfFreq.QuadPart = _perfFreq.QuadPart / 1000;
_lastFrameTime.QuadPart = 0;
そしてvideoRate
次のとおりです。
LONGLONG _videoRate = (LONGLONG) (1000.0/((double)fps));
ビデオ ストリームを作成するときに、AVISTREAMINFO::dwRate メンバーで同じレートを設定していることに注意してください ( http://msdn.microsoft.com/en-us/library/windows/desktop/dd756832(v=vs.85 .aspx )
ビデオの再生が「速く」または「遅く」なる理由について、ヘルプやヒントはありますか? どうもありがとうございました。