C# 寻找源图时的GMFBridge问题

C# 寻找源图时的GMFBridge问题,c#,directshow,C#,Directshow,我试图使用GMFBridge在多个流缓冲区图之间切换,我似乎有两个问题 下面是一张图表: 连接到桥渲染图的桥源图上的VMR非常不稳定——每4-5秒显示一个新帧 如果我搜索连接到桥渲染图的桥源图,那么所有输出(连接的桥源和渲染图中的VMR以及外部渲染器上的输出)都会停止大约一分钟。一旦它恢复,问题1的波动性就消失了 我尝试在查找之前断开并停止桥渲染图,然后在查找之后重新连接并运行它,但我仍然遇到问题,要么是冻结,要么是连接的桥源图上的VMR大约每10秒显示一帧 有点不重要的问题: 我确实有智能T型

我试图使用GMFBridge在多个流缓冲区图之间切换,我似乎有两个问题

下面是一张图表:

  • 连接到桥渲染图的桥源图上的VMR非常不稳定——每4-5秒显示一个新帧

  • 如果我搜索连接到桥渲染图的桥源图,那么所有输出(连接的桥源和渲染图中的VMR以及外部渲染器上的输出)都会停止大约一分钟。一旦它恢复,问题1的波动性就消失了

  • 我尝试在查找之前断开并停止桥渲染图,然后在查找之后重新连接并运行它,但我仍然遇到问题,要么是冻结,要么是连接的桥源图上的VMR大约每10秒显示一帧

    有点不重要的问题:


    我确实有智能T型台,在无限T型台的位置,VMR连接到预览管脚,但在寻找后,它们会以正常速率的1.5-2倍播放,直到它们赶上实时流。有没有一种合理的方法来修复它,这样我就可以返回到智能T形台?

    桥接器会调整进入渲染图的样本上的时间戳,因为两个图中的流时间不同。但是,inftee筛选器将相同的样本发送到其两个输出。因此,源图中的VMR(有时)将被要求渲染其时间戳已在渲染图中调整的样本。您看到的起伏播放是VMR试图追赶失败的结果

    您需要复制数据,或者至少复制元数据,以便修改后的时间戳不会出现在源图中。对于未压缩的视频数据,最简单的方法是插入复制变换,例如颜色空间转换器(可能在inftee和bridge-sink之间)

    为了帮助您调试此类问题,您可以创建一个空文件c:\gmfbridge.txt,桥接代码将创建一个日志,其中包括时间戳调整和延迟

    GMFBridge示例演示了可以将任务划分为多个单独的图,开销非常小,因此它避免了复制数据或在交付管道上引入新线程。但是,对于某些任务来说,这过于复杂,更简单、更解耦的解决方案更合适,例如下游有一个工作线程的缓冲池

    另一个问题是:智能T形三通会从预览输出中去除时间戳,因此T形三通下游的样本一到达就被渲染。在普通的捕获图中,样本带有捕获时间的时间戳——如果您直接将它们传递给渲染器,它们将始终延迟渲染。正确的解决方案是调整从捕获到渲染的延迟时间戳,但剥离时间戳的原始解决方案在大多数情况下都有效。智能tee通过复制IMediaSample对象来实现这一点,但指向同一个数据缓冲区(因此它复制元数据而不是数据)。请注意,如果智能tee认为(根据1996年的启发法)捕获输出落后,它也将丢弃预览输出上的样本


    G

    谢谢你,杰兰特。我本来打算在我的DirectShow论坛帖子中发布这个链接,但我看到你也发现了。我把它放在那里是因为,作为StackOverflow的新用户,我无法添加一些我觉得更相关的标签,我想我在这里的问题会在其他问题中丢失。