1

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

这是图表的图表: http: //massivefailure.net/dshowgraphsalt.jpg

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

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

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

排序不重要的问题:

我确实在无限发球台的位置有智能发球台,VMR 连接到预览引脚,但在寻求它们之后,它们将以正常速率的 1.5-2 倍播放,直到它们赶上直播。有没有一种健全的方法可以修复它,这样我就可以回到智能发球台了?

4

1 回答 1

3

桥会调整进入渲染图的样本的时间戳,因为两个图中的流时间不同。但是,inftee 过滤器将相同的样本发送到它的两个输出。因此,源图中的 VMR 将(有时)被要求渲染其时间戳已在渲染图中调整的样本。您看到的断断续续的播放是 VMR 未能成功追赶的结果。

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

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

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

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

G

于 2009-09-18T08:42:26.083 回答