以正确的速率捕获Direct3D帧

时间:2013-05-30 18:21:37

标签: video hook direct3d avi frame-rate

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

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

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

我正在做的基本上是:

  1. 如果录制视频已开启,请在GrabFrame来电之前致电IDirect3DDevice9::Present

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

  3. (省略代码检查和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

    任何帮助或暗示为什么我会“更快”或“慢”播放视频? 非常感谢你。

0 个答案:

没有答案