在DirectShow中找出samplegrabber准备好的时间

时间:2011-02-17 16:34:34

标签: c++ directshow video-processing samplegrabber

我正在继续研究我的DirectShow应用程序,我只是对它进行了最后的修改。程序正在做的是以1秒的间隔通过视频文件并从samplegrabber捕获当前缓冲区并在继续之前处理它。但是,我注意到我在测试中得到了重复的图像,我发现DirectShow在1秒的时间间隔内没有足够快地增加视频。我的问题是,是否有办法检查DirectShow何时准备好让我调用samplegrabber来获取当前帧并进行处理。此刻我打电话给睡眠1秒,但必须有一个更好的方法。提前感谢您的帮助。

修改

我只是尝试检查视频的位置是否等于我想要抓取和处理的下一个位置。这减少了重复帧的数量,但我仍然看到它们以块的形式出现。

2 个答案:

答案 0 :(得分:0)

我总是让DS框架处理处理速度: 在主应用程序线程中,配置样本采集器回调,然后在触发回调时,您将获得介质样本以及采样时间:此时,如果已经过了适当的间隔,即1秒,则可以处理样本。

你是什么意思,你叫睡一会儿,从哪里(哪个线程)你叫它? 如果您从回调中执行此操作,则实际上是阻止了DirectShow管道?也许如果你能更详细地解释一下你的设置,我可能会更有帮助。

/// Callback that is triggered per media sample
/// Note this all happens in the DirectShow streaming thread!
STDMETHODIMP SampleCB( double dSampleTime, IMediaSample * pSample )
{
  // check timestamp and if one second has elapsed process sample accordingly
  // else do nothing

  ...

  // Get byte pointer
  BYTE* pbData(NULL);
  HRESULT hr = pSample->GetPointer(&pbData);
  if (FAILED(hr)) 
  {
    return hr;
  }

  ...
}

P.S如果您想尽快处理样本,可以在回调中将样本时间戳设置为NULL。

  // set time to NULL to allow for fast rendering since the 
  // the video renderer controls the rendering rate according
  // to the timestamps
  pSample->SetTime(NULL, NULL);

答案 1 :(得分:0)

尝试将图形计时器设置为NULL。它将允许:

  • 尽快处理文件
  • 将解除您的问题。

当然,如果您同时将文件渲染到屏幕,它将无效。