C# 当使用laggy过滤器时,如何防止DirectShow图形帧聚集?

C# 当使用laggy过滤器时,如何防止DirectShow图形帧聚集?,c#,directshow,C#,Directshow,我有一个DirectShow图形,其中SampleGrabber过滤器正在进行一些处理。处理时间长达50毫秒,因此通常播放速度较慢。可以打开和关闭处理 我的问题是,如果处理已经启动了一段时间,当我关闭它时,视频将尽可能快地播放,直到达到某一点。假设这一点是帧时间与流时间匹配的地方,并且不再有任何延迟 我如何才能阻止这种情况发生,以便在我关闭处理时,播放以正常速度进行?我可以在处理数据时关闭流时钟吗?或者,可能会在额外的延迟时间内,再次给来自SampleGrabber过滤器的样本加上时间戳 有人知

我有一个DirectShow图形,其中SampleGrabber过滤器正在进行一些处理。处理时间长达50毫秒,因此通常播放速度较慢。可以打开和关闭处理

我的问题是,如果处理已经启动了一段时间,当我关闭它时,视频将尽可能快地播放,直到达到某一点。假设这一点是帧时间与流时间匹配的地方,并且不再有任何延迟

我如何才能阻止这种情况发生,以便在我关闭处理时,播放以正常速度进行?我可以在处理数据时关闭流时钟吗?或者,可能会在额外的延迟时间内,再次给来自SampleGrabber过滤器的样本加上时间戳

有人知道这样做的正确方法吗

编辑:

我使用了更改样本时间的方法,如下面的答案所示,但在查找和计算样本时间戳方面存在一些问题

我发现一个更好的方法是实现我自己的参考时钟,如果处理时间太长,就停止时钟

只要您正在使用而不是正在使用,您就可以简单地将IMediaSample演示时间戳更新为您想要使用的任何时间戳。您需要使用SampleCB,因为它会给您一个指向实际样本的指针,而BufferCB会在获取样本之前复制样本,这意味着您只是在更新副本

关闭时钟可能对您没有帮助,因为它只会使图表尽可能快地运行。您可以尝试使用更改播放速率,但请记住,许多过滤器不支持速率更改。您还可以实现一个自定义时钟,该时钟根据您的具体需求而变化。

只要您正在使用而不是正在使用,您就可以简单地将IMediaSample演示时间戳更新为您想要使用的任何时间戳。您需要使用SampleCB,因为它会给您一个指向实际样本的指针,而BufferCB会在获取样本之前复制样本,这意味着您只是在更新副本


关闭时钟可能对您没有帮助,因为它只会使图表尽可能快地运行。您可以尝试使用更改播放速率,但请记住,许多过滤器不支持速率更改。您还可以实现一个自定义时钟,根据您的具体要求而有所不同。

删除了我的答案,因为我认为它对您没有帮助无需担心,谢谢阅读。删除了我的答案,因为我认为它对您没有帮助无需担心,谢谢阅读。谢谢-时间戳修复效果很好。这是我认为可能的情况,但我认为可能有一个更优雅的解决方案,如一个函数等,但它真的很容易实现无论如何。谢谢-时间戳修复工作得很好。这是我认为可能的情况,但我认为可能有一个更优雅的解决方案,如一个函数等,但它真的很容易实现无论如何。