2

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

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

我怎样才能阻止这种情况发生,以便在我关闭处理时播放以正常速度?我可以在处理数据时关闭流时钟吗?或者也许再次为来自 SampleGrabber 过滤器的样本添加时间戳,并添加额外的滞后?

有谁知道这样做的正确方法?

编辑:

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

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

4

1 回答 1

0

只要您使用的是ISampleGrabberCB::SampleCB而不是ISampleGrabberCB::BufferCallback ,您就可以使用IMediaSample ::SetTime简单地将 IMediaSample 演示时间戳更新为您想要的任何内容。您需要使用 SampleCB,因为它为您提供了指向实际样本的指针,而 BufferCB 在您获取样本之前复制样本,这意味着您只是在更新副本。

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

于 2009-01-15T09:47:45.873 回答