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

时间:2017-06-16 08:46:59

标签: c# wpf webcam aforge

我正在创建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)
            {

            }
        }

2 个答案:

答案 0 :(得分:1)

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

WebCam.NewFrame -= new NewFrameEventHandler(WebCam_NewFrameReceived);

修改:回复您的评论和已修改的问题

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

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

  

在事件队列展开之前,Dispatcher不会完全关闭。

这样,事件和调度程序与实例断开连接。然后你发信号通知凸轮停下来等待停止。

答案 1 :(得分:0)

您发信号通知网络摄像头停止,但实际上并没有等待它停止。

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

另请查看this aforge.net thread以获取更多信息。