寻找源图时的GMFBridge问题

时间:2009-09-17 22:27:50

标签: c# directshow

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

以下是图表示意图:http://massivefailure.net/dshowgraphsalt.jpg

  1. 连接到桥接渲染图的桥源图上的VMR非常不连贯 - 每4-5秒显示一个新帧。

  2. 如果我寻找连接到桥接渲染图的桥接源图,那么所有输出(连接的桥源中的VMR和渲染图以及外部渲染器上的输出)都会停止大约一分钟。一旦它恢复,问题#1的不稳定就消失了。

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

    一些不重要的问题:

    我确实有无线T恤的智能T恤,VMR连接到预览引脚,但在寻找之后,它们以正常速率1.5-2x播放,直到它们赶上直播。是否有一种理智的方法来解决它,以便我可以回到智能T恤?

1 个答案:

答案 0 :(得分:3)

桥接器调整进入渲染图形的样本的时间戳,因为两个图形中的流时间不同。但是,inftee过滤器将相同的样本发送到它的两个输出。因此,(有时)会要求源图中的VMR呈现其时间戳已在渲染图中调整的样本。您看到的不稳定回放是VMR尝试赶上的失败的结果。

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

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

GMFBridge示例演示了您可以将任务划分为多个单独的图表,而开销非常小,因此可以避免复制数据或在传输管道上引入新线程。但是,对于某些任务而言,这样做过于复杂,更简单,更加分离的解决方案更合适,例如下游工作线程的缓冲池。

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