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

打开与关闭摄像头

c# 复制代码
/// <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 = "打开";
    }
}

实现拍照

c# 复制代码
/// <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);
    }
}

实现录像

c# 复制代码
/// <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();
}

实现录屏

c# 复制代码
/// <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());
    }
}

视频播放

c# 复制代码
/// <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)
相关推荐
卜锦元22 分钟前
音视频媒体服务领域中三种架构方式的定义与区别(Mesh、MCU、SFU)
架构·音视频·媒体
EasyCVR1 小时前
打造景区“视觉中枢”:视频融合平台EasyCVR助力智慧景区安防智能化升级
音视频
上大科技蔡生2 小时前
CS8389、CS8390:防破音,AB/D,2×6.6W立体音频功率放大器
音视频·音频功放
清风与日月3 小时前
c# 集成激光雷达(以思岚A1为例)
开发语言·c#
无极小卒3 小时前
如何在三维空间中生成任意方向的矩形内部点位坐标
开发语言·算法·c#
githubcurry4 小时前
深度相机kinect拍摄的.mkv深度视频为什么特别大,mkv文件中含有什么数据,以及数据格式是什么
人工智能·数码相机·音视频
the白勺5 小时前
RabbitMQ-基础-总结
开发语言·c#
ACP广源盛139246256735 小时前
GSV6127E#ACP#Type-C/DisplayPort 1.4/HDMI 2.0 到 MIPI CSI-2 混合转换器(带嵌入式 MCU)
单片机·嵌入式硬件·音视频
赖small强5 小时前
【ZeroRange WebRTC】Amazon Kinesis Video Streams WebRTC SDK 音视频传输技术分析
音视频·webrtc·nack·pli·twcc·带宽自适应
专注VB编程开发20年6 小时前
C#VB.NET中实现可靠的文件监控(新建、删除、改名、内容修改等事件的准确捕获)
spring·c#·.net·文件监控