1

我正在继续开发我的 DirectShow 应用程序,并且正在对其进行最后的润色。程序正在做的是以 1 秒为间隔浏览一个视频文件,并从采样器中捕获当前缓冲区并在继续之前对其进行处理。但是,我注意到我在测试中得到了重复的图像,我发现 DirectShow 在 1 秒间隔内没有足够快地通过视频增加。我的问题是是否有办法检查 DirectShow 何时准备好让我调用 samplegrabber 以获取当前帧并进行处理。目前我叫 sleep 1 秒钟,但必须有更好的方法。预先感谢您的帮助。

编辑

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

4

2 回答 2

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;
  }

  ...
}

PS 如果您想尽快处理样本,可以在回调中将样本时间戳设置为 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);
于 2011-02-17T16:55:39.307 回答
0

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

  • 尽可能快地处理文件
  • 将减轻您的问题。

当然,如果您同时将文件渲染到屏幕上,它将不起作用。

于 2011-02-17T17:13:58.463 回答