关闭程序后网络摄像头不会停止

Webcam does not stop after closing program

我正在创建 wpf 应用程序并使用我的 USB 网络摄像头捕捉图像。我使用的图书馆是 Aforge。一切都很好,我的意思是我从网络摄像头获得实时流并且我能够捕获图像等。 但问题是,当我关闭程序时,相机仍然是 运行(黄色 LED 灯亮起)并且程序没有结束。我怎样才能让相机停下来?

protected override void OnClosing(CancelEventArgs e)
{
  base.OnClosing(e);            
  if (WebCam != null)
      if (WebCam.IsRunning)
         {
           WebCam.SignalToStop();
           WebCam.WaitForStop();
           WebCam = null;
          }
}

这就是我使用 NewFreameEventArgs 获取流的方式

 public void Cam_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {            
            try
            {
                System.Drawing.Image img = (Bitmap)eventArgs.Frame.Clone();
                MemoryStream ms = new MemoryStream();
                img.Save(ms, ImageFormat.Jpeg);
                ms.Seek(0, SeekOrigin.Begin);
                BitmapImage bi = new BitmapImage();
                bi.BeginInit();
                bi.StreamSource = ms;
                bi.EndInit();
                bi.Freeze();

                Dispatcher.BeginInvoke(new ThreadStart(delegate
                {
                    previewWindow.Source = bi;

                    mainCameraImageControl.Source = bi;
                }));

            }
            catch (Exception ex)
            {

            }
        }

您是在向网络摄像头发出停止信号,但实际上并不是在等待它停止。

您的 Webcam 对象应该有一个 WaitToStop() 方法,您也应该在 SignalToStop() 之后调用该方法。

另请查看 this aforge.net thread 了解更多信息。

我建议您检查一下您是否注册了任何网络摄像头事件。如果是,请取消订阅。

WebCam.NewFrame -= new NewFrameEventHandler(WebCam_NewFrameReceived);

编辑:回复您的评论和编辑的问题

WebCam.NewFrame -= new NewFrameEventHandler(WebCam_NewFrameReceived);
Dispatcher.CurrentDispatcher.InvokeShutdown();
WebCam.SignalToStop();
WebCam.WaitForStop();

首先,取消订阅活动。然后调用InvokeShutdown()。以下来自 Microsoft link

The Dispatcher does not shut down completely until the event queue unwinds.

这样,事件和调度程序就与实例断开了。然后你给凸轮发出停止并等待停止的信号。