1

d3d9.dll IDirect3DDevice9メソッドをフックすることで、Direct3D アプリケーションの挿入に成功しました。

私がやろうとしているのは、アプリケーションの出力の AVI を記録することです。

Video1、XVID などのさまざまなコーデックを使用して、すべてのフレームで適切な AVI ファイルを既に生成できますが、 フレーム レートが正しくないように見えることが問題です (元のアプリケーションの表示と比較して、ビデオがぎくしゃくしすぎたり、速すぎたりします)。

私がやっていることは基本的に次のとおりです。

  1. ビデオの録画がオンの場合は、通話GrabFrameの前にIDirect3DDevice9::Present通話してください。

  2. 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 )

ビデオの再生が「速く」または「遅く」なる理由について、ヘルプやヒントはありますか? どうもありがとうございました。

4

0 に答える 0