C#+AForge 实现视频录制

C#+AForge 实现视频录制

​ 在C#中,使用AForge 库实现视频录制功能是一个比较直接的过程。AForge 是一个开源的.NET框架,提供了许多用于处理图像和视频的类库。

在这里插入图片描述

开发步骤

安装AForge库

​ 首先,确保你的项目中已经安装了 AForge.VideoAForge.Video.FFMPEG.你可以通过NuGet包管理器来实现安装这些库:

  1. 打开你的Visual Studio 项目
  2. 转到工具->NuGet包管理器->管理解决方案的NuGet包
  3. 搜索并安装 AForgeAForge.Video 以及 AForge.Video.FFMPEG

在这里插入图片描述

打开与关闭摄像头

/// <summary>
/// 打开摄像头
/// </summary>
private void OpenCamera()
{//设置视频源并启动this.videoCaptureDevice = new VideoCaptureDevice(filterInfoCollection[this.comboBox1.SelectedIndex].MonikerString);this.videoSourcePlayer1.VideoSource = this.videoCaptureDevice;this.videoSourcePlayer1.Start();isOpen = true;this.btnOpen.Text = "关闭";
}/// <summary>
/// 关闭摄像头
/// </summary>
private void CloseCamera()
{if (this.videoSourcePlayer1.VideoSource != null){this.videoSourcePlayer1.SignalToStop();this.videoSourcePlayer1.WaitForStop();this.videoSourcePlayer1.VideoSource = null;isOpen = false;this.btnOpen.Text = "打开";}
}

实现拍照

/// <summary>
/// 拍照
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{if (!this.isOpen){MessageBox.Show("请先打开摄像头!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);return;}try{//拍照bmp = this.videoSourcePlayer1.GetCurrentVideoFrame();this.pictureBox1.Image = bmp;if (!Directory.Exists("images"))Directory.CreateDirectory("images");string fileName = string.Format("images/图片_{0}.jpg", DateTime.Now.ToString("yyyy-MM-dd hh-mm-ss"));bmp.Save(fileName);}catch (Exception ex){MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);}
}

实现录像

/// <summary>
/// 开始录像
/// </summary>
private void StartRecord()
{if (!Directory.Exists("videos"))Directory.CreateDirectory("videos");string fileName = string.Format("videos/录像_{0}.avi", DateTime.Now.ToString("yyyy-MM-dd hh-mm-ss"));this.videoFileName = fileName;// 创建视频文件写入器videoWriter = new VideoFileWriter();videoSourcePlayer1.NewFrame += VideoSourcePlayer1_NewFrame;videoWriter.Open(fileName, 1280, 960, 30, VideoCodec.MPEG4, 1000000); // 设置分辨率、帧率和比特率
}/// <summary>
/// 停止录像
/// </summary>
private void StopRecord()
{this.CloseCamera();if (videoWriter != null){videoWriter.Close();videoWriter = null;}this.FlushVideoPlayList();
}

实现录屏

/// <summary>
/// 开始录屏
/// </summary>
/// <param name="path"></param>
public void StartRecording(string path) //该方法需要有一个路径参数,前面我们设置过了
{var directory = Path.GetDirectoryName(path);if (!Directory.Exists(directory)) //检查路径是否存在,不存在就自动创建{Directory.CreateDirectory(directory);}try{FrmMain.videoWriter = new VideoFileWriter();//用于生成视频文件,参数分别为路径、视频的宽度、高度、帧数、编码格式以及视频码率FrmMain.videoWriter.Open(path, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, 25, VideoCodec.MPEG4, 5000000);recordingThread = new Thread(RecordScreen);recordingThread.Start();}catch (Exception err){Console.WriteLine(err.ToString());MessageBox.Show("屏幕录制开启失败: " + err.Message, "提示!");}
}/// <summary>
/// 停止录屏
/// </summary>
public void StopRecording()
{try{recordingThread.Join();FrmMain.videoWriter.Close();}catch (Exception err){MessageBox.Show("屏幕录制停止失败: " + err.Message, "提示!");Console.WriteLine(err.ToString());}
}

视频播放

在这里插入图片描述

/// <summary>
/// 双击视频列表
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void listBox1_MouseDoubleClick(object sender, MouseEventArgs e)
{if (this.listBox1.SelectedItem == null) return;this.axWindowsMediaPlayer1.URL = string.Format("videos/{0}", this.listBox1.SelectedItem.ToString());
}

object sender, MouseEventArgs e)
{
if (this.listBox1.SelectedItem == null) return;

this.axWindowsMediaPlayer1.URL = string.Format("videos/{0}", this.listBox1.SelectedItem.ToString());

}


# 源码下载
CSDN: [C#+AForge 实现视频下载](https://download.csdn.net/download/m0_37631902/90477114?spm=1001.2014.3001.5503)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/897645.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP框架加载不上.env文件中的变量

以lumen5.5框架为例&#xff0c;根目录中bootstrap文件夹下的app.php文件中 (new Dotenv\Dotenv(__DIR__./../))->load(); 是读取所有.env中的文件的&#xff0c;这个是正常的&#xff0c;但是在代码中的任何位置或者在config目录下的databases.php里&#xff0c;代码如…

21.Linux 线程库的使用与封装

在linux内核中并没有线程的概念&#xff0c;只有轻量级进程LWP的概念&#xff0c;linux下的线程都是是由LWP进行模拟实现的。因此linux操作系统中不会提供线程的相关接口&#xff0c;只会提供轻量级线程的接口&#xff08;如vfork&#xff0c;clone等&#xff09;。但是在我们的…

Aliyun CTF 2025 web 复现

文章目录 ezoj打卡OKoffens1veFakejump server ezoj 进来一看是算法题&#xff0c;先做了试试看,gpt写了一个高效代码通过了 通过后没看见啥&#xff0c;根据页面底部提示去/source看到源代码&#xff0c;没啥思路&#xff0c;直接看wp吧&#xff0c;跟算法题没啥关系,关键是去…

《鸿蒙系统下AI模型训练加速:时间成本的深度剖析与优化策略》

在当今数字化浪潮中&#xff0c;鸿蒙系统凭借其独特的分布式架构与强大的生态潜力&#xff0c;为人工智能的发展注入了新的活力。随着AI应用在鸿蒙系统上的日益普及&#xff0c;如何有效降低模型训练的时间成本&#xff0c;成为了开发者与研究者们亟待攻克的关键课题。这不仅关…

Git使用(一)--如何在 Windows 上安装 Git:详细步骤指南

如果你想在 Windows 机器上安装 Git&#xff0c;可以按照以下详细指南进行操作。 第一步&#xff1a;下载 Git 可通过官网下载 适用于 Windows 的 Git 最新版本。 如果下载速度较慢&#xff0c;可以通过下面提供的百度网盘 链接下载安装包&#xff0c; https://git-scm.com/d…

基于Prometheus+Grafana的Deepseek性能监控实战

文章目录 1. 为什么需要专门的大模型监控?2. 技术栈组成2.1 vLLM(推理引擎层)2.2 Prometheus(监控采集层)2.3 Grafana(数据可视化平台)3. 监控系统架构4. 实施步骤4.1 启动DeepSeek-R1模型4.2 部署 Prometheus4.2.1 拉取镜像4.2.2 编写配置文件4.2.3 启动容器4.3 部署 G…

本地Git仓库搭建(DevStar)与Git基本命令

本地Git仓库搭建&#xff08;DevStar&#xff09;与Git基本命令 实验环境搭建平台Git基本命令的使用本地仓库的创建代码提交代码合并版本发布 总结 实验环境 搭建平台 按照DevStar的Github仓库要求&#xff0c;在终端中执行下列命令&#xff0c;即可成功安装DevStar到本地部署…

stm32 蓝桥杯 物联网 独立键盘的使用

在蓝桥杯物联网平台里面&#xff0c;有5个外接设备&#xff0c;其中有一个就是6个独立按键。首先&#xff0c;我们先看一下按键有关的电路图。 电路图与cubemx设定 由图可见&#xff0c;独立键盘组由两行三列构成&#xff0c;我们通过行列来锁定要访问的独立按键在哪。ROW1挂…

set_clock_groups

一、命令参数与工具处理逻辑 核心参数定义 参数定义工具行为工具兼容性-asynchronous完全异步时钟组&#xff0c;无任何相位或频率关系&#xff08;如独立晶振、不同时钟树&#xff09;工具完全禁用组间路径的时序分析&#xff0c;但需用户自行处理跨时钟域&#xff08;CDC&a…

工作记录 2017-01-06

工作记录 2017-01-06 序号 工作 相关人员 1 协助BPO进行Billing的工作。 修改CSV、EDI837的导入。 修改邮件上的问题。 更新RD服务器。 郝 修改的问题&#xff1a; 1、 In “Full Job Summary” (patient info.), sometime, the Visit->Facility is missed, then …

Adaptive AUTOSAR UCM模块——快速入门

Adaptive AUTOSAR中的UCM模块介绍 概述 Adaptive AUTOSAR(AUTomotive Open System ARchitecture)是一个开放的行业标准,旨在为现代汽车电子系统提供一个灵活且可扩展的软件框架。在这个框架中,更新与配置管理(Update and Configuration Management, UCM)模块扮演着至关…

解决跨域问题的6种方案

解决跨域问题&#xff08;Cross-Origin Resource Sharing, CORS&#xff09;是 Web 开发中常见的需求&#xff0c;以下是 6 种主流解决方案&#xff0c;涵盖前端、后端和服务器配置等不同层面&#xff1a; 一、CORS&#xff08;跨域资源共享&#xff09; 原理 通过服务器设置…

Python Selenium库入门使用,图文详细。附网页爬虫、web自动化操作等实战操作。

文章目录 前言1 创建conda环境安装Selenium库2 浏览器驱动下载&#xff08;以Chrome和Edge为例&#xff09;3 基础使用&#xff08;以Chrome为例演示&#xff09;3.1 与浏览器相关的操作3.1.1 打开/关闭浏览器3.1.2 访问指定域名的网页3.1.3 控制浏览器的窗口大小3.1.4 前进/后…

50个经典的python库

本文整理了50个可以迅速掌握的经典Python库&#xff0c;了解它们的用途&#xff0c;无论你是刚踏上编程之路&#xff0c;还是希望在Python的世界里更加深入&#xff0c;这50个库都能帮助你快速起飞。 1. Taipy Taipy是一个开源Python库&#xff0c;用于轻松的端到端应用程序开…

【视频】V4L2、ffmpeg、OpenCV中对YUV的定义

1、常见的YUV格式 1.1 YUV420 每像素16位 IMC1:YYYYYYYY VV-- UU– IMC3:YYYYYYYY UU-- VV– 每像素12位 I420: YYYYYYYY UU VV =>YUV420P YV12: YYYYYYYY VV UU =>YUV420P NV12: YYYYYYYY UV UV =>YUV420SP(最受欢迎格式) NV21: YYYYYYYY VU VU =>YUV420SP…

freeswitch(多台服务器级联)

亲测版本centos 7.9系统–》 freeswitch1.10.9本人freeswitch安装路径(根据自己的路径进入)/usr/local/freeswitch/etc/freeswitch使用场景: 使用服务器级联需要双方网络可以ping通,也就是类似局域网内,比如A服务器IP 192.168.1.100 B服务器 192.168.1.101,通过C设备注册…

SpringMVC 基本概念与代码示例

1. SpringMVC 简介 SpringMVC 是 Spring 框架中的一个 Web 层框架&#xff0c;基于 MVC&#xff08;Model-View-Controller&#xff09; 设计模式&#xff0c;提供了清晰的分层结构&#xff0c;适用于 Web 应用开发 SpringMVC 主要组件 DispatcherServlet&#xff08;前端控…

LuaJIT 学习(1)—— LuaJIT介绍

文章目录 介绍Extensions Modulesbit.* — Bitwise operationsffi.* — FFI libraryjit.* — JIT compiler controlC API extensionsProfiler Enhanced Standard Library Functionsxpcall(f, err [,args...]) passes arguments例子&#xff1a; xpcall 的使用 load*() handle U…

std::ranges::views::common, std::ranges::common_view

std::ranges::views::common, std::ranges::common_view C20 引入的用于将范围适配为“通用范围”的工具&#xff0c;主要解决某些算法需要传统迭代器对&#xff08;如 begin 和 end 类型相同&#xff09;的问题。 基本概念 1. 功能 适配传统算法&#xff1a;将范围&#x…

4.3 数组和集合的初始及赋值

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的 版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商…