停止IMediaControl永远不会结束

时间:2016-07-22 14:25:07

标签: c# wpf directshow video-capture directshow.net

我在我的C#/ WPF项目中使用DirectShowLib-2005。当相机启动时,我运行媒体控制:

m_FilterGraph = new FilterGraph() as IFilterGraph2;
/* Initializations */
IMediaControl mediaCtrl = m_FilterGraph as IMediaControl;
hr = mediaCtrl.Run();
DsError.ThrowExceptionForHR(hr);

应用程序运行,相机运行良好。但有时(并非总是)我退出应用程序冻结时。我暂停了调试器,我看到应用程序停在以下行:

if (m_FilterGraph != null)
{
    IMediaControl mediaCtrl = m_FilterGraph as IMediaControl;
    mediaCtrl.Stop();  // <= *** Blocked here ***
    Marshal.ReleaseComObject(m_FilterGraph);
    m_FilterGraph = null;
}

如何防止这种冻结?我可以添加时间或尝试/捕捉吗?

1 个答案:

答案 0 :(得分:3)

如果你look for it,你可以找到许多讨论类似冻结症状的对话,试图阻止流式传输。

单独IMediaControl.Stop的实施以及发布的代码片段都很好。重要的是流是多线程的,并且调用涉及与流线程的同步:发信号通知它停止并等待完成;这也涉及停止所有参与的过滤器。线程问题,任何过滤器或者 - 经常 - 从过滤器到控制代码的回调不小心忽略线程概念可能会导致死锁。

您对此问题的描述不完整。当你面临这种冻结时,你需要:

  1. 确保您了解管道的拓扑结构;您需要了解(并在此类问题中包含)参与过滤器和引脚连接的详细信息
  2. 确保从正确的线程停止图表,特别是不从某些过滤器回调
  3. 附加调试器并检查线程状态,但不仅仅是调用冻结Stop的线程(可能没有任何有意义的细节),还有其他线程,以找到阻止停止同步的其他线程
  4. 问题通常是您的代码导致流式传输停止或参与过滤器的错误。