C# 编程技巧实现屏幕录制功能

前言

在许多应用场景中,屏幕录制是一项非常有用的功能。

不管是用于教学、演示、故障排查还是游戏录制,能够方便快捷地记录屏幕上的活动都是非常有价值的。

本文将详细介绍如何使用 C# 实现屏幕录制功能,帮助大家快速掌握这一实用技能。

环境准备

在开始之前,请确保您已经安装了以下软件:

1、Visual Studio

用于 C# 开发的集成开发环境。

2、FFmpeg

下载并解压 FFmpeg,记录下其可执行文件的路径。

创建 C# 程序

1、创建项目

打开 Visual Studio,新建一个 Windows Forms 应用程序项目,命名为 AppRecordScreen

2、添加控件

在窗口中添加两个按钮,分别用于"开始录制"和"停止录制"。

录屏代码

接下来,需要编写录屏的核心代码。

以下是实现屏幕录制的完整代码:

cs 复制代码
using System.Diagnostics;

namespace AppRecordScreen
{
    public partial class Form1 : Form
    {
        // 录屏相关变量  
        privatebool isRecording = false;
        private Process ffmpegProcess;
        privatestring outputVideoPath;
        // FFmpeg可执行文件的完整路径  
        privatestring ffmpegPath = 
        @"D:\Software\ffmpeg-master-latest-win64-gpl-shared
        \bin\ffmpeg.exe"; 
        public Form1()
        {
            InitializeComponent();
        }

        private async void btnStart_Click(object sender, EventArgs e)
        {
            if (!isRecording)
            {
                StartRecording();
            }
        }

        private void btnStop_Click(object sender, EventArgs e)
        {
            if (isRecording)
            {
                StopRecording();
            }
        }
        /// <summary>  
        /// 开始录制屏幕  
        /// </summary>  
        private void StartRecording()
        {
            // 生成唯一的视频文件名  
            outputVideoPath = Path.Combine(
                Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
                $"ScreenRecord_
                {DateTime.Now:yyyyMMdd_HHmmss}.mp4"
            );

            try
            {
                // 使用FFmpeg进行屏幕录制  
                ffmpegProcess = new Process
                {
                    StartInfo = new ProcessStartInfo
                    {
                        // 使用完整路径  
                        FileName = ffmpegPath,
                        Arguments = $"-f gdigrab -framerate 30 -i desktop 
                        -c:v libx264 -preset ultrafast {outputVideoPath}",
                        UseShellExecute = false,
                        RedirectStandardInput = true,
                        CreateNoWindow = true
                    }
                };

                ffmpegProcess.Start();
                isRecording = true;

                MessageBox.Show("录制已开始", "提示", 
                MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                MessageBox.Show($"启动录制失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>  
        /// 停止录制屏幕  
        /// </summary>  
        private void StopRecording()
        {
            try
            {
                // 发送 'q' 命令给 FFmpeg 进程以正常结束录制  
                ffmpegProcess.StandardInput.WriteLine("q");
                ffmpegProcess.WaitForExit();

                isRecording = false;

                MessageBox.Show($"录制已完成。视频保存在:{outputVideoPath}", "提示", 
                MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                MessageBox.Show($"停止录制失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        // 在关闭窗体时确保停止录制  
        protected override void OnFormClosing(FormClosingEventArgs e)
        {
            if (isRecording)
            {
                StopRecording();
            }
        }
    }
}

代码解释

变量定义

主要定义了录屏相关的变量,包括录制状态、FFmpeg 进程、输出视频路径和 FFmpeg 的可执行文件路径。

开始录制

当用户点击"开始录制"按钮时,StartRecording 方法将被调用,生成一个带有时间戳的唯一视频文件名,并启动 FFmpeg 进程进行屏幕录制。

停止录制

用户点击"停止录制"按钮时,StopRecording 方法会发送结束命令给 FFmpeg 进程,停止录制并保存视频。

关闭窗体

在窗体关闭时,如果正在录制,会自动停止录制,确保视频完整保存。

总结

通过本文的学习掌握如何使用 C# 实现屏幕录制功能,并能够根据实际需求进行扩展和优化。还可以在此基础上不断扩展功能,例如添加视频格式选择、录音功能等。

希望能通过这篇文章大家能够快速上手并开发自己的屏幕录制工具。

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

优秀是一种习惯,欢迎大家留言学习!

作者:技术老小子

出处:mp.weixin.qq.com/s/jhjPVMDnCGlah1M61E2wsg

声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!

相关推荐
还听珊瑚海吗24 分钟前
基于SpringBoot的抽奖系统测试报告
java·spring boot·后端
XYR1212123 小时前
C# 参数
c#
你怎么知道我是队长3 小时前
Go语言标识符
后端·golang
oMMh4 小时前
使用C# ASP.NET创建一个可以由服务端推送信息至客户端的WEB应用(2)
前端·c#·asp.net
Risehuxyc4 小时前
GrassRoot备份项目
c#
咩咩觉主5 小时前
c#数据结构 线性表篇 非常用线性集合总结
开发语言·数据结构·unity·c#·游戏引擎·程序框架
Kookoos6 小时前
ABP vNext + Dapr 实现云原生微服务治理
微服务·云原生·架构·c#·.net
sco52827 小时前
SpringBoot 自动装配原理 & 自定义一个 starter
java·spring boot·后端
火星papa7 小时前
C# 通过ConfigurationManager读写配置文件App.Config
c#·配置文件·app.config
bicijinlian7 小时前
.Net HttpClient 处理响应数据
c#·.net·httpclient·.net httpclient