我通过挂钩d3d9.dll IDirect3DDevice9
方法成功注入了Direct3D应用程序。
我要做的是记录应用程序输出的AVI。
我已经可以使用各种编解码器(例如Video1,XVID等)生成包含所有帧的正确AVI文件,但我的问题是帧速率似乎不正确(视频太乱或太快与原始应用程序显示。)
我正在做的基本上是:
如果录制视频已开启,请在GrabFrame
来电之前致电IDirect3DDevice9::Present
。
GrabFrame
基本上包括检查我们是否处于“正确时间”以获取帧缓冲数据并将其添加为视频帧。以下是一般代码结构:
(省略代码检查和COM ptr的发布)
LARGE_INTEGER now, 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)
任何帮助或暗示为什么我会“更快”或“慢”播放视频? 非常感谢你。