关闭程序后网络摄像头不会停止
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.
这样,事件和调度程序就与实例断开了。然后你给凸轮发出停止并等待停止的信号。
我正在创建 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.
这样,事件和调度程序就与实例断开了。然后你给凸轮发出停止并等待停止的信号。