C#调用AForge实现摄像头录像的示例代码

下面是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技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • AutoCAD二次开发系列教程01-如何在AutoCAD中输出Hello World

    目录 01项目环境准备 02代码示例 03输出示例 04总结 05源码地址 01项目环境准备 A.开发使用的软件:AutoCAD2016、VisualStudio2022 B.建立依赖的本地库(提前从AutoCAD软件安装目录拷贝开发时需要使用的库,如:accoremgd.dll) C.创建新的类库(.Net Framework),注意不同AutoCAD版本…

    C# 2023年5月5日
    00
  • JWT.net 操作实践方法

    JWT.net 操作实践方法 JSON Web Token(JWT)是一种基于JSON格式的Web Token标准,用于在不信任的环境下对用户进行身份验证和授权。JWT.net是一个C#中的JWT实现库,本篇文章将介绍如何使用JWT.net进行JWT生成、验证、签名等操作。 安装 可以通过NuGet包管理器或者命令行安装JWT.net: Install-Pa…

    C# 2023年5月31日
    00
  • DevExpress之ChartControl实现时间轴实例

    下面我将为您详细讲解实现DevExpress ChartControl的时间轴的完整攻略。 1、前期准备 在开始实现时间轴功能之前,我们需要首先完成以下几个准备工作: 安装DevExpress控件库 我们需要在项目中引入DevExpress控件库,因此需要先进行安装。可以下载最新版本的DevExpress控件库并进行安装或通过NuGet管理器进行安装。 添加…

    C# 2023年6月1日
    00
  • C#利用时间和随即字符串创建唯一的订单编号

    创建唯一的订单编号通常需要使用时间戳和随机字符串,这种方式可以避免重复订单的产生。下面我们来讲解一下如何利用C#实现这种方法。 利用时间戳生成订单编号 时间戳是指从1970年1月1日00时00分00秒到现在的总秒数。我们可以将当前时间转换为时间戳,并将时间戳作为订单编号的一部分,从而保证每个订单编号都是唯一的。 下面是一个示例代码: // 获取当前时间的时间…

    C# 2023年6月1日
    00
  • C# 计算DataTime的4种时间差的方法(相差天数、相差小时、相差分钟、相差秒)

    下面我来详细讲解“C# 计算DataTime的4种时间差的方法(相差天数、相差小时、相差分钟、相差秒)”的完整攻略。 1. 计算相差天数 可以使用DateTime的Subtract方法计算出两个时间之间相差的TimeSpan,然后获取TimeSpan中的Days属性即可。 DateTime startTime = DateTime.Now; DateTime…

    C# 2023年5月31日
    00
  • 如何通过C#/VB.NET 代码调整PDF文档的页边距

    PDF边距是页面主要内容区域和页面边缘之间的距离。与Word页边距不同,PDF文档的页边距很难更改。因为Adobe没有提供操作页边距的直接方法。但是,您可以通过缩放页面内容来改变页边距。本文将介绍如何在不更改页面大小的情况下使用C#/VB.NET 代码调整PDF文档的页边距。 增加PDF文档的页边距 缩短PDF文档的页边距 增加PDF文档的页边距 扩大PDF…

    C# 2023年5月4日
    00
  • C#利用服务器实现客户端之间通信

    C#利用服务器实现客户端之间通信 在C#中,我们可以使用 TCP、UDP 等协议,以及 socket 编程来实现客户端之间的通信。下面将详细介绍基于 TCP 协议的服务器和客户端之间的通信实现。 环境准备 在进行操作之前,需要准备以下环境: 安装 Visual Studio 开发工具 使用 C# 语言进行开发 服务器端代码 1. 引入命名空间 要使用 soc…

    C# 2023年6月7日
    00
  • WinForm导出文件为Word、Excel、文本文件的方法

    WinForm是一种典型的Windows桌面应用程序开发技术,它提供了丰富的界面控件和处理逻辑的能力。在WinForm应用中,我们需要经常使用到文件导出功能,常见的导出格式包括Word文档、Excel文档以及文本文件。本篇攻略将详细介绍WinForm导出文件为Word、Excel、文本文件的方法,并提供两个示例说明。 1. 导出Word文档 1.1 安装并引…

    C# 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部