我通过挂钩d3d9.dll IDirect3DDevice9
方法成功地注入了 Direct3D 应用程序。
我要做的是记录应用程序输出的 AVI。
我已经可以使用各种编解码器(如 Video1、XVID 等)生成包含所有帧的正确 AVI 文件,但我的问题是 帧速率似乎不正确(与原始应用程序显示相比,视频太生涩或太快)。
我正在做的基本上是:
如果录制视频已开启,请在通话
GrabFrame
前IDirect3DDevice9::Present
致电。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 )
为什么我的视频播放“更快”或“更慢”有任何帮助或提示?非常感谢。