English 中文(简体)
如何在使用处理缓慢的滤镜时防止DirectShow图形框架聚集?
原标题:
  • 时间:2009-01-15 03:55:53
  •  标签:

我有一个DirectShow图形,其中SampleGrabber滤镜进行一些处理。处理需要高达50毫秒,因此播放速度经常变慢。处理可以打开和关闭。

我的问题是,如果处理时间已经很长,当我关闭它时,视频会尽可能地快速播放,直到达到某个点。 可能这个点是帧时间与流时间匹配且不再有任何滞后的地方。

我该如何阻止这种情况发生,这样当我关闭处理时,回放速度就是正常的?我可以在处理数据时关闭流时钟吗?或者再次将通过SampleGrabber过滤器输出的样本进行时间戳记,添加额外的滞后时间?

有谁知道这该怎么做?

编辑:

我使用下面答案中显示的更改样本时间的方法,但在寻求和计算样本时间戳方面遇到了一些问题。

我发现更好的方法是实现自己的参考时钟,并在处理时间过长时停止时钟。

最佳回答

只要你使用ISampleGrabberCB::SampleCB而不是ISampleGrabberCB::BufferCallback,你可以使用IMediaSample::SetTime简单地更新IMediaSample演示时间戳。你需要使用SampleCB,因为它给你一个指向实际样本的指针,而BufferCB在获取之前复制了样本,这意味着你只更新了复制件。

关闭时钟可能没有帮助,因为它只会让图形以最快的速度运行。您可以尝试使用IMediaSeeking::SetRate更改播放速率,但请记住,许多过滤器不支持速率变化。您也可以实现一个根据您的精确要求变化的自定义时钟。

问题回答

暂无回答




相关问题
热门标签