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

时间:2011-10-25 11:42:36

标签: filter directshow decoder

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

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

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

问题是:如何将此与流时间相关联并为SetTime函数创建合理的值?我已经玩过了它,但是我放入的值似乎只是锁定了CBaseOutputPin :: Deliver函数的过滤器图形。

1 个答案:

答案 0 :(得分:0)

最简单的时间戳如下。您将第一个媒体样本的时间标记为零(请参阅下一段中的调整说明),并且以下内容将标记有差异。也就是说,您开始流式传输并从网络源获取第一个样本,您记得这次UTC0并将零附加到DirectShow媒体示例。在第1,2,... N帧之后,UTC时间为UTC1 ... UTCN,并将转换为DirectShow时间UTCN - UTC0。您可能需要额外转换为正确的单位,因为DirectShow需要100 ns单位,而您的网络资源可能会给您1/90000 s。

由于您的源可能是实时源,并且您的第一帧可能不是完全在图表运行时获得,您可能会使用当前过滤器图形IReferenceClock::GetTime与收到的时间之间的差异调整结果媒体采样时间戳作为IBaseFilter::Run电话的参数。