我有一个DirectShow图表,SampleGrabber过滤器正在进行一些处理。处理时间长达50毫秒,因此播放速度通常较慢。处理可以打开和关闭。
我的问题是,如果处理已开启一段时间,当我将其关闭时,视频会尽可能快地播放,直到达到某一点。据推测,这一点是帧时间与流时间匹配的地方,并且不再存在任何滞后。
如何阻止这种情况发生,以便当我关闭处理时,播放速度是否正常?我可以在处理数据时关闭流时钟吗?或者可能会再次从SampleGrabber过滤器中取出样本的时间戳,并添加额外的延迟?
有谁知道这样做的正确方法?
编辑:
我使用了更改采样时间的方法,如下面的答案所示,但在搜索和计算样本时间戳方面存在一些问题。
我发现更好的方法是实现我自己的参考时钟,并在处理时间过长时停止时钟。
答案 0 :(得分:0)
只要您使用的是ISampleGrabberCB::SampleCB而不是ISampleGrabberCB::BufferCallback,您只需使用IMediaSample::SetTime将IMediaSample演示文稿时间戳更新为您想要的任何内容。您需要使用SampleCB,因为它会为您提供指向实际样本的指针,而BufferCB会在您获取样本之前复制样本,这意味着您只是更新了副本。
关闭时钟可能对您没有帮助,因为它只会使图表尽可能快地运行。您可以尝试使用IMediaSeeking::SetRate更改播放速率,但请记住,许多过滤器不支持速率更改。您还可以实现根据您的具体要求而变化的自定义时钟。