感谢 Roman R 对我之前的问题的回答,我现在有了一个异步过滤器,其中包含一个 3rd 方解码器库。
编码的输入样本来自网络源。目前我没有向解码帧添加时间戳,因此帧速率相当不稳定,因为它取决于接收数据包的时间。
当库解码完整帧时,它还会根据源编码器上的时钟提供帧捕获时间的 UTC 时间戳。
问题是:如何将其与流时间相关联并为 SetTime 函数创建一个合理的值?我玩过它,但我输入的任何值似乎都将过滤器图锁定在 CBaseOutputPin::Deliver 函数中。
感谢 Roman R 对我之前的问题的回答,我现在有了一个异步过滤器,其中包含一个 3rd 方解码器库。
编码的输入样本来自网络源。目前我没有向解码帧添加时间戳,因此帧速率相当不稳定,因为它取决于接收数据包的时间。
当库解码完整帧时,它还会根据源编码器上的时钟提供帧捕获时间的 UTC 时间戳。
问题是:如何将其与流时间相关联并为 SetTime 函数创建一个合理的值?我玩过它,但我输入的任何值似乎都将过滤器图锁定在 CBaseOutputPin::Deliver 函数中。
最简单的时间戳如下。您用零标记您的第一个媒体样本(请参阅下一段中的调整说明),以下内容将被标记为不同。也就是说,您开始流式传输并从网络源获得第一个样本,您记住这次UTC0
并将零附加到 DirectShow 媒体样本。以下帧 1, 2 ... N 与 UTC 时间UTC1
...UTCN
并将转换为 DirectShow 时间UTCN
- UTC0
。您可能需要额外转换为适当的单位,因为 DirectShow 需要 100 ns 单位,而您的网络源可能会为您提供 1/90000 s 之类的东西。
由于您的源可能是实时源,并且您的第一帧可能不是在图形运行时获得的,因此您可能正在使用当前过滤器图形IReferenceClock::GetTime
与作为调用参数接收的时间之间的差异来调整生成的媒体样本时间戳IBaseFilter::Run
。