Filter DirectShow推送源、同步和时间戳

Filter DirectShow推送源、同步和时间戳,filter,push,directshow,Filter,Push,Directshow,我有一个过滤图,它接收原始音频和视频输入,然后使用ASF编写器将它们编码为WMV文件 我已经编写了两个定制的推送源过滤器来为图形提供输入。音频过滤器只是在环回模式下使用WASAPI来捕获音频并向下游发送数据。视频过滤器获取原始RGB帧并将其发送到下游 对于音频和视频帧,我有捕获帧时的性能计数器值 问题1:如果我想正确地为视频和音频添加时间戳,我需要创建一个使用性能计数器的自定义参考时钟,还是有更好的方法来同步两个输入,即计算流时间 视频输入是从其他地方的Direct3D缓冲区捕获的,我无法保证帧

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

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

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

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

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

例如,假设视频过滤器理想情况下希望以25 FPS的速度运行,但由于延迟等原因,第1帧在1/25标记处完美启动,但第2帧的启动时间晚于预期的2/25标记。这意味着由于第1帧的结束时间与第2帧的开始时间不匹配,因此图形中现在有一个间隙

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

  • 一种选择是省略时间戳,但这可能会导致过滤器无法处理此数据。另一种选择是使用生成时间戳-无论如何,这比直接使用性能计数器作为时间戳源更可取。
  • 是的,你需要给视频和音频加上时间戳,以保持它们的同步,这是判断数据实际上属于同一时间的唯一方法
  • 视频样本没有时间,您可以忽略停止时间或将其设置为等于开始时间,视频帧停止时间和下一帧开始时间之间的间隔不会产生任何后果
  • 渲染器可以自由选择是否需要遵守时间戳,当然,对于音频,您需要平滑的流而不需要时间戳间隙
  • 一种选择是省略时间戳,但这可能会导致过滤器无法处理此数据。另一种选择是使用生成时间戳-无论如何,这比直接使用性能计数器作为时间戳源更可取。
  • 是的,你需要给视频和音频加上时间戳,以保持它们的同步,这是判断数据实际上属于同一时间的唯一方法
  • 视频样本没有时间,您可以忽略停止时间或将其设置为等于开始时间,视频帧停止时间和下一帧开始时间之间的间隔不会产生任何后果
  • 渲染器可以自由选择是否需要遵守时间戳,当然,对于音频,您需要平滑的流而不需要时间戳间隙

  • 我可能错了,但我认为视频帧没有结束时间(或结束时间总是在开始后1毫秒)。这是因为视频帧只是某个时刻的样本。所以我认为对于视频来说,间隔不是问题。我可能错了,但我认为视频帧没有结束时间(或者结束时间总是在开始后1毫秒)。这是因为视频帧只是某个时刻的样本。所以我认为差距对视频来说不是问题。如果两个输入源不同(它们是不同的),我仍然需要一个公共时钟来同步它们。我想我可以从性能计数器手动计算开始时间,并通过自定义接口将值传递给我的两个输入过滤器。至少我可以在计算流时间时使用它。无论哪种方式,我都不得不使用性能计数器作为捕获时间,因为这是WASAPI返回给我的,视频帧是在另一个过程中捕获的,所以我需要一些系统范围的东西。除非你有更好的主意。因此,如果我捕获的FPS比目标FPS快一点,这样我就不会有潜在的差距,这会更好吗?1。性能计数器不准确,会累积错误
    系统参考时钟
    准确,精度较小,但仍然足够。2.捕获以达到目标FPS,我不认为让它更快实际上会让事情变得更好。1。那么,如何同步这两个流呢?当我将新帧推送到视频输入过滤器时,如果当时使用过滤器参考时间,它将与实际捕获帧的时间不匹配,因为在捕获帧和将其传送到输入过滤器之间有很大的延迟。另一方面,音频输入的延迟要短得多,因此我担心这两个流会不同步。如果两个输入源不同(它们是不同的),我仍然需要一个公共时钟来同步它们。我想我可以从性能计数器手动计算开始时间,并通过自定义接口将值传递给我的两个输入过滤器。至少我可以在计算流时间时使用它。无论哪种方式,我都不得不使用性能计数器作为捕获时间,因为这是WASAPI返回给我的,视频帧是在另一个过程中捕获的,所以我需要一些系统范围的东西。除非你有更好的主意。因此,如果我捕获的FPS比目标FPS快一点,这样我就不会有潜在的差距,这会更好吗?1。性能计数器不准确,会累积错误
    系统参考时钟
    准确,精度较小,但仍然足够。2.捕获以达到目标FPS,我不认为让它更快实际上会让事情变得更好。1。那么,如何同步这两个流呢?当我将新帧推送到视频输入过滤器时,如果当时使用过滤器参考时间,它将与实际捕获帧的时间不匹配