下面是C#调用AForge实现摄像头录像的完整攻略,分为以下几个步骤:
1. 引用 AForge 库
在 Visual Studio 中创建 C# 项目后,右键点击“引用”,选择“管理 NuGet 程序包”打开 NuGet 程序包管理器,搜索并安装 AForge 库。
2. 初始化摄像头设备
在 C# 代码中申明VideoCaptureDevice对象并初始化其参数,具体代码如下:
using AForge.Video;
using AForge.Video.DirectShow;
...
// 初始化摄像头设备
private FilterInfoCollection videoDeviceList = null;
private VideoCaptureDevice videoDevice = null;
private VideoCapabilities[] videoCapabilities = null;
// 填充设备列表
videoDeviceList = new FilterInfoCollection(FilterCategory.VideoInputDevice);
if (videoDeviceList.Count == 0) {
throw new ApplicationException("找不到任何相机设备!");
}
// 选择第 0 个设备
videoDevice = new VideoCaptureDevice(videoDeviceList[0].MonikerString);
// 获取摄像头支持的格式
videoCapabilities = videoDevice.VideoCapabilities;
以上代码通过 FilterCategory.VideoInputDevice
获取所有视频录制设备,如果数量为0,说明没有找到任何摄像头,抛出 ApplicationException 异常。
第2个代码块通过 moniker string 初始化VideoCaptureDevice对象,这里默认选择第一个设备(索引为0),开发者也可以根据某些条件手动选择其他的设备。
3. 开始录像
在 C# 代码中,在点击开始录制按钮后,使用上面定义的 VideoCaptureDevice
开始捕获摄像头画面,可以使用 FrameEvent 类型方法来获取摄像头每一帧数据,在此方法中,默认将数据写入定义的 AVI 文件中:
videoDevice.NewFrame += new NewFrameEventHandler(video_NewFrame);
videoDevice.Start();
private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
using (var bitmap = (Bitmap)eventArgs.Frame.Clone()) {
writer.WriteVideoFrame(bitmap);
}
}
以上代码将捕获到的每一帧图像数据转换为Bitmap类型,可以根据需求对图像数据进行处理然后存储到DeflateStream压缩流中。最后,通过定义的 VideoFileWriter 类型对象将处理后的数据写入 AVI 文件中。
4. 结束录像
在 C# 代码中,在停止录制按钮中,通过关闭定义的 VideoCaptureDevice 释放资源并停止录像,最后释放定义的 VideoFileWriter 对象。
if (videoDevice != null && videoDevice.IsRunning) {
videoDevice.SignalToStop();
videoDevice.WaitForStop();
}
writer.Close();
以上就是利用 C# 和 AForge 库实现的摄像头录像的完整攻略。
附:下面是一个完整的示例代码,代码用于实现延时 5 秒后录制视频,并将视频保存到本地 。
using AForge.Video.DirectShow;
using AForge.Video.FFMPEG;
using System;
using System.Drawing;
using System.IO;
using System.Threading;
using System.Windows.Forms;
namespace CaptureVideo
{
public partial class Form1 : Form
{
private VideoCaptureDevice videoDevice = null;
private VideoCapabilities[] videoCapabilities = null;
private VideoFileWriter writer = null;
private bool isRecording = false;
public Form1()
{
InitializeComponent();
}
private void btnStart_Click(object sender, EventArgs e)
{
Timer timer = new Timer(TimerCallback, null, 5000, 0);
}
private void TimerCallback(Object o)
{
this.Invoke(new Action(() =>
{
isRecording = true;
string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "record.avi");
//设置录制的参数
File.Delete(filePath);
writer = new VideoFileWriter();
writer.Open(filePath, 640, 480, 15, VideoCodec.MPEG4);
// 初始化摄像头设备
var videoDeviceList = new FilterInfoCollection(FilterCategory.VideoInputDevice);
if (videoDeviceList.Count == 0)
{
throw new ApplicationException("No video capture devices found!");
}
videoDevice = new VideoCaptureDevice(videoDeviceList[0].MonikerString);
videoCapabilities = videoDevice.VideoCapabilities;
videoDevice.NewFrame += new NewFrameEventHandler(video_NewFrame);
videoDevice.Start();
}));
}
private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
if (isRecording)
{
var bitmap = (Bitmap)eventArgs.Frame.Clone();
writer.WriteVideoFrame(bitmap);
}
}
private void btnStop_Click(object sender, EventArgs e)
{
isRecording = false;
if (videoDevice != null && videoDevice.IsRunning)
{
videoDevice.SignalToStop();
videoDevice.WaitForStop();
}
writer.Close();
}
}
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#调用AForge实现摄像头录像的示例代码 - Python技术站