【问题标题】:GMFBridge DirectShow filter SetLiveTiming effectGMFBridge DirectShow 滤镜 SetLiveTiming 效果
【发布时间】:2018-09-14 19:11:25
【问题描述】:

我正在使用出色的 GMFBridge directshow family of filters 效果很好,让我可以关闭视频记录图并打开一个新图,而不会丢失数据。

我的原始源图是从标准视频和音频输入捕获实时视频。

GMFBridgeController 过滤器上有一个未记录的方法,名为 SetLiveTiming()。从名称来看,我认为如果我们从 Live 图表(而不是文件)捕获,这应该设置为 true,就像我的情况一样。我将此值设置为true,一切都按预期工作

相同的捕获硬件允许我捕获直播电视信号(在我的例子中是 ATSC),因此我使用 BDA 架构过滤器创建了一个新版本的图表,用于调整目的。一旦数据从 MPEG 解复用器流出,该图的其余部分实际上与我的原始图相同。

但是,在这种情况下,我的复用图(在桥的另一侧)无法正常工作。数据从BridgeSource 过滤器(视频和音频)流出并到达 MP4 混合器过滤器,但是没有数据从混合器输出流向 FileWriter 过滤器

几个小时后,我将问题追溯到SetLiveTiming() 设置。我将其关闭一切都开始按预期工作。 混合器过滤器开始生成输出文件,但是,音频未与视频同步。

有人能告诉我SetLiveTiming() 设置的真正目的吗?也许,为什么一个图表在启用该设置的情况下工作,而另一个则失败?

更新

我设法编译了 GMFBridge 项目,由于时间戳计算为负,过滤器似乎正在丢弃每个接收到的样本。但是,我对启用过滤器日志后看到的结果感到完全困惑。

更新 2: 丢弃的样本是通过我启动辅助(复用器)图的方式引入的。我使用 SampleGrabber(因此在流式线程中)作为触发点检查了一个示例,并使用 Task.Run() .NET 调用来实例化复用器图。这不知何故弄乱了时钟,我在未来结束了一个“参考起点”——当桥试图通过减去参考起点来修复时间戳时,它产生了一个负时间戳——一旦我纠正了这个并从应用程序线程(通过发布图形事件),问题已得到解决。

很遗憾,我的多路复用视频(无论SetLiveTiming() 设置如何)仍然不同步

我读到GMFBridge filter can have trouble when the InfTee filter is being used,但是,我认为我的图表不应该有这个问题,因为没有 InfTee 过滤器的实例直接连接到桥接接收器。

这是我当前的源图:

                                                                   -->[TIF]
                                                                  |
 [NetworkProvider]-->[DigitalTuner]-->[DigitalCapture]-->[demux]--|-->[Mpeg Tables]
                                                                  |
                                                                  |-->[lavAudioDec]-->[tee]-->[audioConvert]-->[sampleGrabber]-->[NULL]
                                                                  |                        |
                                                                  |                        |
                                                                  |                         ->[aacEncoder]----------------
                                                                  |                                                       |--->[*Bridge Sink*]
                                                                   -->[VideoDecoder]-->[sampleGrabber]-->[x264Enc]--------

这是我的复用器图:

                      video  
 ...  |bridge source|-------->[MP4 muxer]--->[fileWriter]
             |                     ^
             |        audio        |
              ---------------------

图表中的所有样本抓取器都是只读的。 如果我在没有桥接的情况下复用输出文件(通过将复用器放在捕获图上),输出文件保持同步, (这最终不是真的,不同步问题是由 H264 编码器中的延迟设置引入的),但我无法避免在释放当前捕获图和运行新捕获图(使用更新的文件名)之间损失几秒钟

更新 3:

几天前我无意中引入了不同步问题,当时我关闭了 x264vfw 编码器中的“零延迟”设置。我没有注意到这个设置也使我已经工作的图表不同步,我责怪桥过滤器。

总之,我把事情搞砸了:

  1. 从应用程序以外的线程启动复用器图 线程(处理图的事件循环的线程)。

  2. 上游过滤器中的延迟开关可能正在延迟 多路复用器无法跟上。

【问题讨论】:

    标签: directshow


    【解决方案1】:

    作者评论:

    // 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);
    

    该方法启用了一种处理实时数据的特殊操作模式。在这种模式下,采样时间在图表之间转换为相对于各自的时钟开始时间。否则,默认模式是期望随着图形更改将时间戳重置为零。

    【讨论】:

    • 谢谢 Roman,从我的洞察力中我现在注意到我可以安全地在我的用例的两个图表上保持标志关闭。您是否知道是什么导致复用器过滤器在启用设置的情况下拒绝产生输出? (这可能是一个危险信号,表明我在使用我的图形构建代码做一些固有的错误)。再次感谢!
    • 我刚刚注意到的一件事,关闭设置会产生输出,但最终录制时音频和视频不再同步:(
    • 我想样本最终会因为时间戳冲突而被丢弃。您可能需要从源代码和调试/跟踪示例时间构建桥梁,以了解究竟发生了什么。最终多路复用器要求输入的样本连续加上时间戳,否则它本身会忽略它们或引发故障。无论如何,没有实时定时设置桥解决了更改图形时连续时间戳的问题,但是它使用了另一种方法。大概它失去了视频和音频之间的同步,然后您在生成的文件中看到了这种效果。
    • 我注意到您更新了帖子并已包含跟踪摘录。请注意,在实时计时模式下,时间戳会在源(您在帖子中包含的内容)和接收器中调整两次。 STO 在源中被删除,上游图的 STO 被添加到接收器中。令人困惑的数学可能在这两个地方都有。如果您的原始数据不是实时的,我宁愿调查同步丢失而不是修复SetLiveTiming。我宁愿不使用相对于时钟开始时间的时间,除非您的流媒体确实是实时的。
    • 终于我明白了……“原始”问题确实是我启动复用器图的方式。 x264vfw 过滤器中的设置引入了不同步问题。几天前我取消了一个名为“零延迟”的选项,我没有注意到它会导致多路录音不同步,即使移除了桥!重新启用设置后,网桥工作正常。再次感谢罗曼! =D
    猜你喜欢
    • 1970-01-01
    • 2011-08-31
    • 2016-06-26
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 2014-05-10
    相关资源
    最近更新 更多