【发布时间】: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 编码器中的“零延迟”设置。我没有注意到这个设置也使我已经工作的图表不同步,我责怪桥过滤器。
总之,我把事情搞砸了:
从应用程序以外的线程启动复用器图 线程(处理图的事件循环的线程)。
上游过滤器中的延迟开关可能正在延迟 多路复用器无法跟上。
【问题讨论】:
标签: directshow