Filter 如何在解码器过滤器中创建时间戳?

Filter 如何在解码器过滤器中创建时间戳?,filter,directshow,decoder,Filter,Directshow,Decoder,感谢Roman R对我上一个问题的回答,我现在有了一个异步过滤器包装了第三方解码器库 编码的输入样本来自网络源。目前,我没有向解码帧添加时间戳,因此帧速率相当不稳定,因为它取决于接收数据包的时间 当库解码完整帧时,它还提供根据源编码器上的时钟捕获帧的时间的UTC时间戳 问题是:如何将其与流时间关联,并为SetTime函数创建合理的值?我已经尝试过了,但是我输入的任何值似乎都锁定了CBaseOutputPin::Deliver函数中的过滤图。最简单的时间戳如下所示。您在第一个介质样本上加盖时间戳(

感谢Roman R对我上一个问题的回答,我现在有了一个异步过滤器包装了第三方解码器库

编码的输入样本来自网络源。目前,我没有向解码帧添加时间戳,因此帧速率相当不稳定,因为它取决于接收数据包的时间

当库解码完整帧时,它还提供根据源编码器上的时钟捕获帧的时间的UTC时间戳


问题是:如何将其与流时间关联,并为SetTime函数创建合理的值?我已经尝试过了,但是我输入的任何值似乎都锁定了CBaseOutputPin::Deliver函数中的过滤图。

最简单的时间戳如下所示。您在第一个介质样本上加盖时间戳(见下一段中的调整注释),以下内容将在其上加盖差异。也就是说,您开始流式传输,并从网络源获取第一个样本,您还记得这一次UTC0并将零附加到DirectShow媒体样本。以下第1、2帧。。。N UTC时间UTC1。。。UTCN和将转换为DirectShow time UTCN-UTC0。您可能需要额外转换为合适的单位,因为DirectShow需要100 ns的单位,而您的网络源可能会为您提供大约1/90000 s的单位


由于您的源可能是一个活动源,并且您的第一帧可能不是在图形运行时获得的,因此您可能正在使用当前筛选器图形的iReferenceLock::GetTime和IBaseFilter::run调用的参数接收的时间之间的差来调整生成的媒体采样时间戳。

谢谢。我确实尝试了这些方法,但我使用了IReferenceLock::GetTime的当前值,而没有减去IBaseFilter::Run中的时间。我假设这导致我的过滤器锁定,因为GetTime返回的值可能是系统时间而不是过滤器时间。。是吗?是的,这个值不是零对齐的,所以您可能计划在长时间延迟后播放数据。谢谢。明天早上我再试试。