在WPF中 和 WinForm中使用有些细微差别需要注意
WinForm
using System;
using System.Drawing;
using System.Windows.Forms;
using AForge.Video;
using AForge.Video.DirectShow;
namespace WindowsFormsApplication_Video
{
public partial class Form1 : Form
{
private FilterInfoCollection _videoDevices = null;
private VideoCaptureDevice _cameraDevice = null;
public Form1()
{
InitializeComponent();
this.FormClosing += Form1_FormClosing;
try
{
_videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
if (_videoDevices.Count == 0)
{
MessageBox.Show("未找到摄像头");
return;
}
FilterInfo info = _videoDevices[0];//获取第一个摄像头
_cameraDevice = new VideoCaptureDevice(info.MonikerString);
_cameraDevice.NewFrame += OnCameraNewFrame;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误");
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
OnStopCamera();
}
private void OnStartCamera()
{
if (_cameraDevice != null)
_cameraDevice.Start();
}
private void OnStopCamera()
{
//WinForm可以直接调用Stop,但是WPF不可以,会卡住
if (_cameraDevice != null && _cameraDevice.IsRunning)
_cameraDevice.Stop();
//WPF方式
//if (_cameraDevice != null && _cameraDevice.IsRunning)
//_cameraDevice.SignalToStop();
}
//异步线程
private void OnCameraNewFrame(object sender, NewFrameEventArgs eventArgs)
{
Bitmap bmp = (Bitmap)eventArgs.Frame.Clone();
pictureBox1.Image = bmp;
}
private void playToolStripMenuItem_Click(object sender, EventArgs e)
{
OnStartCamera();
}
private void pauseToolStripMenuItem_Click(object sender, EventArgs e)
{
OnStopCamera();
}
}
}