• 基于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

  • 相关阅读:
    FZU 2112 并查集、欧拉通路
    HDU 5686 斐波那契数列、Java求大数
    Codeforces 675C Money Transfers 思维题
    HDU 5687 字典树插入查找删除
    HDU 1532 最大流模板题
    HDU 5384 字典树、AC自动机
    山科第三届校赛总结
    HDU 2222 AC自动机模板题
    HDU 3911 线段树区间合并、异或取反操作
    CodeForces 615B Longtail Hedgehog
  • 原文地址:https://www.cnblogs.com/DHUtoBUAA/p/5551085.html
Copyright © 2020-2023  润新知