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

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

相关推荐
神奇小汤圆15 分钟前
面试被问烂的Java虚拟机调优,我用一个实战案例给你讲得明明白白
后端
明月_清风1 小时前
开发者网络概念全扫盲:一篇搞定
后端·网络协议
明月_清风1 小时前
零信任入门:从"城堡护城河"到"每次进门都要刷卡"
后端
站大爷IP2 小时前
Python循环中修改字典键导致遍历异常深度解析实战案例
后端
掘金者阿豪5 小时前
高可用读写分离实战(二):我把数据库主库停了,结果整个集群的反应和我想象的不一样
后端
掘金者阿豪5 小时前
《高可用读写分离集群实战》系列(一)
后端
Dilee5 小时前
Spring AI 2.0.0 Prompt 最小 Demo:system、user、template 到底怎么分工
后端
未秃头的程序猿5 小时前
Java 26正式发布!这3个新特性,让代码量直接减半
java·后端·面试