DirectShow推送源,同步和时间戳

时间:2011-11-05 21:15:05

标签: filter push directshow

我有一个过滤器图表,它接收原始音频和视频输入,然后使用ASF Writer将它们编码为WMV文件。

我编写了两个自定义推送源过滤器来为图形提供输入。音频过滤器仅在环回模式下使用WASAPI来捕获音频并向下游发送数据。视频滤镜采用原始RGB帧并将其发送到下游。

对于音频和视频帧,我都有捕获帧时的性能计数器值。

问题1:如果我想为视频和音频添加正确的时间戳,我是否需要创建一个使用性能计数器的自定义参考时钟,或者是否有更好的方法让我同步两个输入,即计算流时间?

视频输入是从其他地方的Direct3D缓冲区捕获的,我无法保证帧速率,因此它的行为类似于实时源。当然,我总是知道一帧的开始时间,但我怎么知道结束时间?

例如,假设视频滤镜理想情况下需要以25 FPS运行,但由于延迟等原因,帧1在1 / 25th标记处完美启动,但帧2的开始时间晚于预期的2/25标记。这意味着图表中现在存在间隙,因为第1帧的结束时间与第2帧的开始时间不匹配。

问题2:下游过滤器是否知道如何处理第1帧和第2帧之间的延迟,或者我是否需要手动减少第2帧的长度?

1 个答案:

答案 0 :(得分:1)

  1. 一个选项是省略时间戳,但这可能最终导致过滤器无法处理此数据。另一个选择是使用System Reference Clock生成时间戳 - 无论如何,这比直接使用性能计数器作为时间戳源更可取。
    1. 是的,您需要为视频和音频添加时间戳以保持同步,这是告诉数据实际归因于同一时间的唯一方法
    2. 视频样本没有时间,可以省略停止时间或将其设置为等于开始时间,视频帧停止时间与下一帧开始时间之间的差距没有后果
  2. 呈现者可以自由选择是否需要尊重时间戳,有了音频,你当然会想要流畅的时间戳而没有时间戳。