zoukankan      html  css  js  c++  java
  • 基于FFMpeg的C#录屏全攻略

          最近负责一个录屏的小项目,需要录制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协议,可以考虑使用VLC media player播放器,或者安装Win7codecs解码包。

     

     

    3、C#开发

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

     1 public void RunFFmpeg()
     2 
     3         {
     4 
     5             Process[] KillProcessArray = Process.GetProcessesByName("ffmpeg");
     6 
     7             Debug.WriteLine(KillProcessArray.Length.ToString());
     8 
     9             foreach (var KillProcess in KillProcessArray)
    10 
    11             {
    12 
    13                 KillProcess.Kill();
    14 
    15             }
    16 
    17             Process p = new Process();//建立外部调用线程
    18 
    19             p.StartInfo.FileName = @"E:ffmpegffmpeg.exe";   //ffmpeg.exe的绝对路径
    20 
    21             p.StartInfo.Arguments = @"-f dshow -i video=""screen-capture-recorder"" -r 15 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency D:MyDesktop.mkv";  //ffmpeg的参数
    22 
    23             p.StartInfo.UseShellExecute = false;           //是否使用操作系统shell启动
    24 
    25             p.StartInfo.RedirectStandardError = true;      //重定向标准错误输出
    26 
    27             p.StartInfo.CreateNoWindow = true;             //不显示程序窗口
    28 
    29             p.ErrorDataReceived += new DataReceivedEventHandler(Output);
    30 
    31             p.Start();
    32 
    33             myProcessId = p.Id;                            //获取关联进程的唯一标识符
    34 
    35             p.BeginErrorReadLine();
    36 
    37         }
    38 
    39         public void StopFFmpeg()
    40 
    41         {
    42 
    43             Process myProcess = Process.GetProcessById(myProcessId);  //通过ID关联进程
    44 
    45             myProcess.Kill();
    46 
    47         }
    48 
    49         private void Output(object sendProcess,DataReceivedEventArgs output)
    50 
    51         {
    52 
    53             if (!String.IsNullOrEmpty(output.Data))
    54 
    55                 Debug.WriteLine(output.Data.ToString());
    56 
    57         }
    58 
    59         static void Main(string[] args)
    60 
    61         {
    62 
    63             CmdHelper ch = new CmdHelper();
    64 
    65             ch.RunFFmpeg();
    66 
    67             Console.WriteLine("Hello");
    68 
    69             Thread.Sleep(10000);
    70 
    71             Console.WriteLine("10s passed");
    72 
    73             ch.StopFFmpeg();
    74 
    75

    参考链接:

    http://blog.csdn.net/zhichao2001/article/details/12526095

    http://blog.csdn.net/leixiaohua1020/article/details/38284961

    http://www.ffmpeg.org/ffmpeg-devices.html#gdigrab

  • 相关阅读:
    没有什么,开发ASP.NET时随便写写,想到什么写什么
    MS SQL Server带有时间的记录怎样查询
    给RadioButtonList绑定Selected的值
    在GridView控件内文本框实现TextChanged事件
    MS SQL Server递归查询
    ASP.NET MVC使用jQuery无刷新上传
    MySQL 慢查询操作梳理
    ubuntu系统下防火墙简单使用
    crontab日常使用梳理
    ubuntu下nginx+php5的部署
  • 原文地址:https://www.cnblogs.com/DHUtoBUAA/p/5551085.html
Copyright © 2011-2022 走看看