2025年3月21日 星期五 甲辰(龙)年 月廿 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > .net

基于FFMpeg的C#录屏全攻略

时间:03-24来源:作者:点击数:50

最近负责一个录屏的小项目,需要录制Windows窗口内容并压缩保存到指定文件夹,本想使用已有的录屏软件,但是本着学习的态度去探索了FFMpeg,本文主要介绍基于FFMpeg开源项目的C#录屏软件开发。

在Windows平台下开发录屏相比Linux比较复杂,Windows平台下录屏有gdigrab和dshow两种方法,由于gdigrab可修改属性受限,所以本文采用dshow方法实现录屏的功能,原理是注册录屏dshow滤镜(例如screen-capture-recorder),然后通过dshow获取录屏图像然后编码处理,其中gdigrab可以详见http://www.ffmpeg.org/ffmpeg-devices.html#gdigrab。

软件开发环境:

Windows7 32位

Visual Studio2013

screen capture recorder(需要Java运行环境Java Runtime Environment)

1、软件安装完成后,可以在CMD命令行中检测软件安装是否正确,首先进入FFMpeg.exe的根目录文件夹,输入命令:ffmpeg -list_devices true -f dshow -i dummy 命令执行后检查输出的结果是否有[dshow@xxx]"screen-capture-recorder",如果有则“screen capture recorder”软件安装正确。

2、录屏测试:

在CMD窗口中进入FFMpeg.exe所在的根目录文件夹,输入录屏指令:ffmpeg -f dshow -i video="screen-capture-recorder" -r 15 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency MyDesktop.mkv

如果上述指令执行后,可以在FFMpeg软件的根目录生成MyDesktop.mkv的视频文件则录屏成功,如果MyDesktop.mkv无法播放,需要注意播放器是否支持H264协议,可以考虑使用VLCmediaplayer播放器,或者安装Win7codecs解码包。

3、C#开发

C#程序中调用FFMpeg.exe程序,并且不显示命令行窗口界面,来完成FFMpeg.exe的录屏功能,在视频录制完成后对视频文件进行压缩,其中主要函数如下所示。注意:在CMD命令行中FFMpeg.exe输出的结果需要在ErrorDataReceived中创建事件才可以显示。

  • public void RunFFmpeg()
  • {
  • Process[] KillProcessArray = Process.GetProcessesByName("ffmpeg");
  • Debug.WriteLine(KillProcessArray.Length.ToString());
  • foreach (var KillProcess in KillProcessArray)
  • {
  • KillProcess.Kill();
  • }
  • Process p = new Process();//建立外部调用线程
  • p.StartInfo.FileName = @"E:\ffmpeg\ffmpeg.exe"; //ffmpeg.exe的绝对路径
  • p.StartInfo.Arguments = @"-f dshow -i video=""screen-capture-recorder"" -r 15 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency D:\MyDesktop.mkv"; //ffmpeg的参数
  • p.StartInfo.UseShellExecute = false; //是否使用操作系统shell启动
  • p.StartInfo.RedirectStandardError = true; //重定向标准错误输出
  • p.StartInfo.CreateNoWindow = true; //不显示程序窗口
  • p.ErrorDataReceived += new DataReceivedEventHandler(Output);
  • p.Start();
  • myProcessId = p.Id; //获取关联进程的唯一标识符
  • p.BeginErrorReadLine();
  • }
  • public void StopFFmpeg()
  • {
  • Process myProcess = Process.GetProcessById(myProcessId); //通过ID关联进程
  • myProcess.Kill();
  • }
  • private void Output(object sendProcess,DataReceivedEventArgs output)
  • {
  • if (!String.IsNullOrEmpty(output.Data))
  • Debug.WriteLine(output.Data.ToString());
  • }
  • static void Main(string[] args)
  • {
  • CmdHelper ch = new CmdHelper();
  • ch.RunFFmpeg();
  • Console.WriteLine("Hello");
  • Thread.Sleep(10000);
  • Console.WriteLine("10s passed");
  • ch.StopFFmpeg();
  • }

 

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门