停止IMediaControl永远不会结束

本文关键字:结束 永远 IMediaControl 停止 | 更新日期: 2023-09-27 17:58:17

我的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;
}

如何防止这种冻结?我可以加一个暂停或尝试/接球吗?

停止IMediaControl永远不会结束

如果你寻找它,你会发现周围有很多对话讨论类似的冻结症状,试图停止流媒体。

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

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

  1. 确保您了解管道的拓扑结构;您需要了解(并包括在这样的问题中)有关参与过滤器和引脚连接的详细信息
  2. 请确保从正确的线程停止图形,特别是从特定的筛选器回调
  3. 附加调试器并检查线程状态,但不仅是调用冻结Stop的线程(可能没有任何有意义的细节),还有其他线程,以找到阻止停止同步的其他相关线程

问题通常是您的代码在停止流时导致死锁,或者参与过滤器出现错误。

  • 清理DirectShow图形-DirectShow图形未停止
  • 使用CC解码器筛选器时,停止Directshow图形会冻结WinXP
  • IID_IMediaControl在停止时卡住
  • IMediaControl::没有信号时停止挂起

  • IMediaControl::stop方法挂起

  • IMediaControl::停止偶尔需要很长时间才能完成
  • 为什么IMediaControl::Stop()挂起
  • 应用程序挂起使用我的图像捕获设备调用IMediaControl::Stop()