Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GMFBridge DirectShow过滤器设置实时计时效果_Directshow - Fatal编程技术网

GMFBridge DirectShow过滤器设置实时计时效果

GMFBridge DirectShow过滤器设置实时计时效果,directshow,Directshow,我正在使用出色的GMFBridge,效果非常好,允许我关闭视频记录图形并打开一个新图形,而不会丢失数据 我最初的源图是从标准视频和音频输入捕获实时视频 GMFBridgeController过滤器上有一个名为SetLiveTiming()的未记录方法。根据名称,我认为如果我们像我的情况那样从活动图(而不是从文件)捕获,那么应该将其设置为true。我将该值设置为true,所有操作都按预期进行 同样的捕获硬件允许我捕获实时电视信号(在我的例子中是ATSC),因此我使用BDA架构过滤器创建了一个新版本

我正在使用出色的GMFBridge,效果非常好,允许我关闭视频记录图形并打开一个新图形,而不会丢失数据

我最初的源图是从标准视频和音频输入捕获实时视频

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编码器中的“零延迟”设置。我没有注意到这个设置也使我已经工作的图形失去了同步,我把责任归咎于桥接过滤器

总之,我把事情搞砸了:

  • 从应用程序以外的线程启动muxer图 线程(处理图形的事件循环的线程)

  • 上游筛选器中可能正在延迟的延迟开关 事情太多了,muxer无法跟上

  • 作者评论:

    // 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
    。除非您的流确实是实时的,否则我宁愿不使用相对于时钟开始时间的时间.我终于找到了…原版的