我使用DirectShow.NET与GMFBridge一起构建一个类似于GMFPreview示例应用程序的应用程序,它允许用户在视频捕获停止时从视频中呈现预览而不会出现故障。
在我的应用程序中,不是在点击按钮时开始/停止捕获,而是每30分钟一次,所以我从视频源连续录制,分成30分钟文件 - 它不应该是在停止/开始间隔期间丢失一帧。
过滤器的简化布局是:
[ Source Graph ]
RTSP/RTMP Source [video+audio] --> Inf. Tee Filter --> Bridge Sink -->
--> [ Bridge Controller ] -->
--> Bridge Source --> AsfWriter [Capture graph]
--> Bridge Source --> NullRenderer [Preview graph]
这里使用GMFBridge的重点是它允许RTSP / RTMP Source始终连接。顺便说一下,我的来源是局域网中的设备。
当我停止捕捉时,我这样做:
public void Break()
{
int hr = BridgeController.BridgeGraphs(null, null);
int hr = RecMediaControl.Stop(); // stops the capture graph
... // Set filename for next recording
int hr = RecMediaControl.Run(); // starts the capture graph
int hr = BridgeController.BridgeGraphs(bridgeSink, captureGraph);
}
问题是运行此代码的线程有时会卡在"断开"方法:
BridgeGraphs(null, null);
不会抛出任何错误,它会永远停留在那里。其他线程继续正常执行,因此我获得了一个巨大的视频文件,而不是几个30分钟的文件。
预览图在应用程序开始运行时启动,在应用程序完成时也会停止。解释如何使用GMFBridge的文章似乎是为具有Capture引脚和Preview引脚的设备编写的,这不是我的情况。我认为我所做的事情将Bridge Controller设置为挂起模式而不是丢弃模式,这可能更合适,但我不确定。不过,如果我删除预览图,则会出现同样的问题。
这个问题并非在所有机器上发生,而且也是随机发生的 - 有时我需要等待几个小时甚至几天才能实现。我没有想法,任何人都知道发生了什么?感谢。