最近负责一个录屏的小项目,需要录制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中创建事件才可以显示。

 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();

             Console.WriteLine("10s passed");

             ch.StopFFmpeg();

         } 

参考链接:

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

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

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

基于FFMpeg的C#录屏全攻略的更多相关文章

  1. Windows 7 蓝屏代码大全 & 蓝屏全攻略

    关于Windows 7.Vista等系统的蓝屏,之前软媒在Win7之家和Vista之家都有很多文章讨论过,但是都是筛选的常见的一些问题,今天这个文章是个大全,希望大家看着别头痛,文章收藏下来以后待查即 ...

  2. 蓝屏代码大全 & 蓝屏全攻略

    转载自http://diybbs.zol.com.cn/15/86_141447.html 一.蓝屏含义 1.故障检查信息 ***STOP 0x0000001E(0xC0000005,0xFDE38A ...

  3. Windows 7 蓝屏代码大全 & 蓝屏全攻略

    关于Windows 7.Vista等系统的蓝屏.之前软媒在Win7之家和Vista之家都有非常多文章讨论过,可是都是筛选的常见的一些问题,今天这个文章是个大全.希望大家看着别头痛.文章收藏下来以后待查 ...

  4. [转]Mac下配置基于SecurID的Cisco IPSec VPN全攻略(有图)

    来自: http://www.eefocus.com/Kevin/blog/11-09/230878_53c71.html RSA的SecurID长的是这个样子滴: Mac里面,可以设置VPN, 方法 ...

  5. 用C#制作PDF文件全攻略

    用C#制作PDF文件全攻略 目  录 前    言... 3 第一部分 iText的简单应用... 4 第一章 创建一个Document 4 第一步 创建一个Document实例:... 5 第二步 ...

  6. H5 移动调试全攻略

    H5 移动调试全攻略 随着移动设备的高速发展,H5 开发也成为了 F2E 不可或缺的能力.而移动开发的重中之重就是掌握调试技巧,定 Bug于无形. 一.概要 因为移动端操作系统分为 iOS 和 And ...

  7. 【C#代码实战】群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法

    若干年前读研的时候,学院有一个教授,专门做群蚁算法的,很厉害,偶尔了解了一点点.感觉也是生物智能的一个体现,和遗传算法.神经网络有异曲同工之妙.只不过当时没有实际需求学习,所以没去研究.最近有一个这样 ...

  8. TestLink安装全攻略

    TestLink安装全攻略 此文章转自该链接--http://www.cnblogs.com/Tcorner/archive/2011/07/26/2117296.html 安装前准备 需要下载xam ...

  9. Android使用XML全攻略(2)

    Android使用XML全攻略(2)   Android 是针对移动设备的一种新兴的开源操作系统和 SDK.借助它,您可以创建功能强大的移动应用程序.当您的应用程序可以访问 Web 服务时,其吸引力会 ...

随机推荐

  1. 201521123019 《Java程序设计》第3周学习总结

    1. 本周学习总结 2. 书面作业 (1)代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; ...

  2. locale命令设置语言环境

    locale命令设置语言环境 在Linux中通过locale来设置程序运行的不同语言环境,locale由 ANSI C提供支持.locale的命名规则为_.,如zh_CN.GBK,zh代表中文, CN ...

  3. Java课程设计----仿Windows标准型计算器

    JAVA课程设计 仿Windows标准型计算器(By Yanboooooooo) 一.团队介绍: 连燕波[组长]:网络1513学生. 张文博[组员]:网络1513学生. 二.项目git地址 码云项目地 ...

  4. CentOS克隆机器步骤,图文教程

    在上一篇文章中,主要介绍了CentOS的装机步骤,这一篇文章主要介绍如何从一台装好的CentOS克隆出另一台机器,并且配置好网络. 首先被克隆的CentOS需要关机, 右键点击被克隆的CentOS-& ...

  5. linux 下怎样查找一个文件夹在哪个目录下?

    如果只显示所在目录的路径: find 目录 -type d -name "查询目录名" -printf "%h\n" 如果同时显示目录名称和所在目录的路径: f ...

  6. Laravel 源码解读系列第四篇-Auth 机制

    前言 Laravel有一个神器: php artisan make:auth 能够快速的帮我们完成一套注册和登录的认证机制,但是这套机制具体的是怎么跑起来的呢?我们不妨来一起看看他的源码.不过在这篇文 ...

  7. Ningx集群环境搭建

    Ningx集群环境搭建 Nginx是什么? Nginx ("engine x") 是⼀个⾼性能的 HTTP 和 反向代理 服务器,也是⼀个 IMAP/ POP3/SMTP 代理服务 ...

  8. 关于maven中一些问题的解决尝试

    在maven中会遇到很多问题,pom.xml啊,数据库没有自动建表等等. 需要先把运行项目,所依赖的jar项目install安装一下,然后Maven --> update project 一下. ...

  9. Mybatis——choose, when, otherwise可以达到switch case效果

    在mapping文件中实现动态sql,如果想达到if else的效果可以使用:choose, when, otherwise <choose> <when test="ti ...

  10. PeopleRank

    PeopleRank:基于PageRank的理论,以每个微博账户的“关注”为链出链接,“粉丝”为链入链接的这种以人为核心的关系. PeopleRank假设条件:– 数量假设:如果一个用户节点接收到的其 ...