GMFBridge DirectShow过滤器设置实时计时效果
我正在使用出色的GMFBridge,效果非常好,允许我关闭视频记录图形并打开一个新图形,而不会丢失数据 我最初的源图是从标准视频和音频输入捕获实时视频GMFBridge DirectShow过滤器设置实时计时效果,directshow,Directshow,我正在使用出色的GMFBridge,效果非常好,允许我关闭视频记录图形并打开一个新图形,而不会丢失数据 我最初的源图是从标准视频和音频输入捕获实时视频 GMFBridgeController过滤器上有一个名为SetLiveTiming()的未记录方法。根据名称,我认为如果我们像我的情况那样从活动图(而不是从文件)捕获,那么应该将其设置为true。我将该值设置为true,所有操作都按预期进行 同样的捕获硬件允许我捕获实时电视信号(在我的例子中是ATSC),因此我使用BDA架构过滤器创建了一个新版本
GMFBridgeController
过滤器上有一个名为SetLiveTiming()
的未记录方法。根据名称,我认为如果我们像我的情况那样从活动图(而不是从文件)捕获,那么应该将其设置为true
。我将该值设置为true
,所有操作都按预期进行
同样的捕获硬件允许我捕获实时电视信号(在我的例子中是ATSC),因此我使用BDA架构过滤器创建了一个新版本的图形,用于调谐目的。一旦数据从MPEG解复用器流出,图形的其余部分实际上与我的原始图形相同
然而,在这个位置上,我的muxing图形(在桥的另一边)不起作用。数据从BridgeSource
过滤器(视频和音频)流入MP4多路复用器过滤器,但是没有数据从多路复用器输出流入FileWriter
过滤器
几个小时后,我将问题追溯到SetLiveTiming()
设置。我关掉了它,一切都开始正常工作了。muxer过滤器开始生成输出文件,但是音频与视频不同步
有人能告诉我设置SetLiveTiming()
的真正目的吗?也许,为什么一个图形在启用设置的情况下工作,而另一个图形失败了?
更新
我设法编译了GMFBridge项目,由于时间戳计算为负数,过滤器似乎正在删除每个接收到的样本。然而,启用过滤器日志后看到的结果让我完全困惑
更新2:丢弃的样本是通过我启动二级(muxer)图的方式引入的。我使用SampleGrabber(因此在流式线程中)作为触发点检查了一个样本,并使用Task.Run()
.NET调用实例化muxer图。这不知何故打乱了时钟,我在将来有了一个“参考起点”——当网桥试图通过减去参考起点来修复时间戳时,它产生了一个负的时间戳——一旦我纠正了这一点并从应用程序线程生成了图(通过发布一个图事件),问题就解决了
不幸的是,我的多路复用视频(无论设置如何)仍然不同步
我读到,但是,我认为我的图形不应该有这个问题,因为没有infte过滤器的实例直接连接到桥接接收器
以下是我当前的源代码图:
-->[TIF]
|
[NetworkProvider]-->[DigitalTuner]-->[DigitalCapture]-->[demux]--|-->[Mpeg Tables]
|
|-->[lavAudioDec]-->[tee]-->[audioConvert]-->[sampleGrabber]-->[NULL]
| |
| |
| ->[aacEncoder]----------------
| |--->[*Bridge Sink*]
-->[VideoDecoder]-->[sampleGrabber]-->[x264Enc]--------
这是我的muxer图:
video
... |bridge source|-------->[MP4 muxer]--->[fileWriter]
| ^
| audio |
---------------------
图中的所有示例抓取器都是只读的。如果我在没有桥接的情况下对输出文件进行多路复用(通过将多路复用器放置在捕获图上),输出文件将保持同步,(结果并非如此,H264编码器中的延迟设置导致了不同步问题),但我无法避免在释放当前捕获图之间损失几秒钟,并运行新文件(使用更新的文件名)
更新3:
不同步问题是我几天前无意中引入的,当时我关闭了x264vfw编码器中的“零延迟”设置。我没有注意到这个设置也使我已经工作的图形失去了同步,我把责任归咎于桥接过滤器
总之,我把事情搞砸了:
// using this option, you can share a common clock
// and avoid any time mapping (essential if audio is in mux graph)
[id(13), helpstring("Live Timing option")]
HRESULT SetLiveTiming([in] BOOL bIsLiveTiming);
该方法启用一种处理实时数据的特殊操作模式。在该模式下,采样时间在图形之间相对于各自的时钟开始时间进行转换。否则,默认模式是随着图形的更改将时间戳重置为零。谢谢你,罗曼,从这一点我现在注意到,我可以安全地在我的用例中关闭两个图形上的标志。您是否知道是什么原因导致muxer过滤器在启用设置的情况下拒绝生成输出?(这可能是一个危险信号,表明我的图形构建代码存在固有的错误)。再次感谢!我刚刚注意到,关闭设置会产生输出,但音频和视频在最终录制中不再同步:(我假设由于时间戳冲突,样本最终会被丢弃。您可能需要从源代码和调试/跟踪样本时间建立桥接,以了解到底发生了什么。最终,多路复用器要求传入样本连续加时间戳,否则它本身会忽略它们或引发故障。没有live定时设置桥接器解决了更改图形时连续时间戳的问题,但它使用的是另一种方法。可能它会丢失视频和音频之间的同步,然后您会在生成的文件中看到这种效果。我注意到您更新了帖子并已包含跟踪摘录。请注意,在实时定时模式下,时间戳是广告在源代码中调整了两次(您在帖子中包含的内容)但在接收器中也是如此。源中删除了STO,而在接收器中添加了上游图的STO。这两个地方可能都有令人困惑的数学问题。如果您的原始数据不是实时的,我宁愿研究同步丢失,也不愿修复
SetLiveTiming
。除非您的流确实是实时的,否则我宁愿不使用相对于时钟开始时间的时间.我终于找到了…原版的