我试图使用GMFBridge在多个流缓冲区图之间切换,我似乎有两个问题。
下面是图的图表:http://massivefailure.net/dshowgraphsalt.jpg
我尝试过在查找之前断开和停止桥接渲染图,并在查找后重新连接和运行它,但是我仍然存在问题,要么冻结它,要么在连接的桥源图上显示大约每10秒一帧的VMR。
有点不重要的问题:
我确实有智能的三通,无限的三通,与VMRs连接到预览引脚,但在寻找之后,他们会回放1.5-2倍的正常速度,直到他们赶上现场流。有什么办法能解决这个问题吗?这样我就可以回到一个聪明的座位上去了?
发布于 2009-09-18 08:42:26
桥调整进入渲染图的样本上的时间戳,因为流时间在这两个图中是不相同的。但是,插入过滤器向其两个输出发送相同的示例。因此,源图中的VMR (有时)将被要求呈现其时间戳已在呈现图中调整的样本。你所看到的波涛汹涌的回放是VMR试图追赶失败的结果。
您需要复制数据,或者至少复制元数据,这样修改后的时间戳就不会出现在源图中。对于未压缩的视频数据,最简单的方法是插入一个拷贝转换,例如颜色空间转换器(可能在插入器和桥接接收器之间)。
为了帮助您调试这样的问题,您可以创建一个空文件c:\gmfbridge.txt,桥代码将创建一个包含时间戳调整和延迟的日志。
GMFBridge示例演示了可以将任务划分为多个独立的图,并且开销很小,因此它避免了复制数据或在传递管道上引入新线程。但是,对于某些任务来说,这是过于复杂的,并且是一个更简单、更解耦的解决方案,例如在下游有一个工作线程的缓冲池。
在另一个问题上:智能tee从预览输出中剥离时间戳,因此tee下游的示例在到达时立即呈现。在一个正常的捕获图中,样本会用它们的捕获时间进行时间戳--如果您将这些时间直接传递给渲染器,它们总是会延迟呈现。正确的解决方案是调整从捕获到呈现的延迟时间戳,但是剥除时间戳的粗略解决方案在大多数情况下都是有效的。智能tee通过复制IMediaSample对象来做到这一点,但是指向相同的数据缓冲区(因此它复制元数据,而不是数据)。请注意,如果智能tee认为(根据1996年启发法)捕获输出落后于预览输出,那么它也将丢弃预览输出上的示例。
G
https://stackoverflow.com/questions/1441649
复制相似问题