C#基于FFmpeg实现录屏功能

一、前言

上一篇文章已经知道了FFmpeg的录屏命令格式,那么,如何自己开发c#程序,实现录屏功能呢?其实单纯利用c#开发录屏软件,方法有很多:

  • 可以基于Accord(AForge)自行开发,思路就是以一定时间间隔捕获屏幕,再利用Accord实现高效的视频编码等,但是这样做一是稍微复杂了一点,二是不知道怎么利用GPU加速,毕竟占CPU太高的话,影响使用。大神可以自行研究一下。
  • 可以基于FFmpeg.AutoGen开发,这个可以看做是FFmpeg的C#版吧,但是这个东西对.Net Framework4.5以上兼容性不好啊,原作者貌似现在也没解决这个问题,总之就是没研究明白,还浪费了不少时间,先放弃了。
  • 可以基于OpencvSharp,原理与Accord类似,自己实现录屏的捕获桌面、编码等全过程,没试过,不知道效率怎么样,不过以opencv的尿性,应该值得信赖吧。
  • 可以基于ScnLib,这是一家公司开发的录屏SDK,有各种语言实现的版本,能试用(有水印),东西好是真的好,但是也真贵啊,本着程序员自给自足的精神,花钱买它真是羞耻。(土豪忽略)
  • 可以基于FFmpeg.exe,c#程序后台调用这个进程,实现录屏,实际上就是借用FFmpeg.exe来实现录屏,这个方法简单,而且人家FFmpeg做的那么好,干嘛不用呢,节约时间,开干吧。

二、方法

通过调用系统API加载ffmpeg.exe,向其模拟输入命令的的方式进行录屏录音,然后模拟输入q用于暂停录制。具体实现方式如下,直接上代码:

    public class ScreenRecordHelper
    {
        #region 模拟控制台信号需要使用的API

        [DllImport("kernel32.dll")]
        static extern bool GenerateConsoleCtrlEvent(int dwCtrlEvent, int dwProcessGroupId);

        [DllImport("kernel32.dll")]
        static extern bool SetConsoleCtrlHandler(IntPtr handlerRoutine, bool add);

        [DllImport("kernel32.dll")]
        static extern bool AttachConsole(int dwProcessId);

        [DllImport("kernel32.dll")]
        static extern bool FreeConsole();

        #endregion

        //ffmpeg进程
        static Process ffmpegProcess = new Process();

        //ffmpeg.exe实体文件路径,建议把ffmpeg.exe及其配套放在自己的Debug目录下
        static string ffmpegPath = AppDomain.CurrentDomain.BaseDirectory + "bin\\ffmpeg.exe";
        //static string ffmpegPath = @"C:\Users\awang\Desktop\ScreenRecord\ffmpeg-N-101429-g54e5d21aca-win64-gpl-shared-vulkan\bin\ffmpeg.exe";

        /// <summary>
        /// 开始录制
        /// </summary>
        /// <param name="outFilePath">录屏文件保存路径</param>
        public static void Start(string outFilePath)
        {
            if (File.Exists(outFilePath))
            {
                File.Delete(outFilePath);
            }

            string arguments = "-f gdigrab -framerate 15 -r 15 -i desktop -pix_fmt yuv420p -f dshow -i audio=" + "\"virtual-audio-capturer\"" + " -vcodec" + " h264_qsv" + " \"" + outFilePath + "\"";
            /*转码,
             * 视频录制设备:gdigrab;
             * 录制对象:整个桌面desktop;
             * 音频录制方式:dshow;
             * 音频输入:virtual-audio-capturer;
             * 视频编码格式:h.264;
             * 视频帧率:15;
             * 硬件加速:若N卡加速:h264_nvenc;若集显加速:h264_qsv;若软件编码:libx264;
            */

            ProcessStartInfo startInfo = new ProcessStartInfo(ffmpegPath);
            startInfo.WindowStyle = ProcessWindowStyle.Normal;
            startInfo.Arguments = arguments;
            startInfo.UseShellExecute = false;//不使用操作系统外壳程序启动
            startInfo.RedirectStandardError = true;//重定向标准错误流
            startInfo.CreateNoWindow = true;//默认不显示窗口
            startInfo.RedirectStandardInput = true;//启用模拟该进程控制台输入的开关
            //startInfo.RedirectStandardOutput = true;

            ffmpegProcess.ErrorDataReceived += new DataReceivedEventHandler(Output);//把FFmpeg的输出写到StandardError流中
            ffmpegProcess.StartInfo = startInfo;

            ffmpegProcess.Start();//启动
            ffmpegProcess.BeginErrorReadLine();//开始异步读取输出
        }

        /// <summary>
        /// 停止录制
        /// </summary>
        public static void Stop()
        {
            ffmpegProcess.StandardInput.WriteLine("q");//在这个进程的控制台中模拟输入q,用于停止录制
            ffmpegProcess.Close();
            ffmpegProcess.Dispose();
        }

        /// <summary>
        /// 控制台输出信息
        /// </summary>
        private static void Output(object sender, DataReceivedEventArgs e)
        {
            if (!String.IsNullOrEmpty(e.Data))
            {
                Console.WriteLine(e.Data.ToString());
            }
        }
    }

搞定 舒服了

FFmpeg下载安装及命令说明见我上一篇:https://blog.csdn.net/awangdea99/article/details/114555743?spm=1001.2014.3001.5501
代码借鉴了:https://blog.csdn.net/HW140701/article/details/84185018

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值