1

我通过挂钩d3d9.dll IDirect3DDevice9方法成功地注入了 Direct3D 应用程序。

我要做的是记录应用程序输出的 AVI。

我已经可以使用各种编解码器(如 Video1、XVID 等)生成包含所有帧的正确 AVI 文件,但我的问题是 帧速率似乎不正确(与原始应用程序显示相比,视频太生涩或太快)。

我正在做的基本上是:

  1. 如果录制视频已开启,请在通话GrabFrameIDirect3DDevice9::Present致电。

  2. GrabFrame基本上包括检查我们是否在“正确的时间”获取帧缓冲区数据并将其添加为视频帧。以下是一般的代码结构:

(省略了代码检查和 COM ptr 的发布)



LARGE_INTEGER 现在,min_time;
查询性能计数器(&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