基于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中创建事件才可以显示。
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#录屏全攻略的更多相关文章
- Windows 7 蓝屏代码大全 & 蓝屏全攻略
关于Windows 7.Vista等系统的蓝屏,之前软媒在Win7之家和Vista之家都有很多文章讨论过,但是都是筛选的常见的一些问题,今天这个文章是个大全,希望大家看着别头痛,文章收藏下来以后待查即 ...
- 蓝屏代码大全 & 蓝屏全攻略
转载自http://diybbs.zol.com.cn/15/86_141447.html 一.蓝屏含义 1.故障检查信息 ***STOP 0x0000001E(0xC0000005,0xFDE38A ...
- Windows 7 蓝屏代码大全 & 蓝屏全攻略
关于Windows 7.Vista等系统的蓝屏.之前软媒在Win7之家和Vista之家都有非常多文章讨论过,可是都是筛选的常见的一些问题,今天这个文章是个大全.希望大家看着别头痛.文章收藏下来以后待查 ...
- [转]Mac下配置基于SecurID的Cisco IPSec VPN全攻略(有图)
来自: http://www.eefocus.com/Kevin/blog/11-09/230878_53c71.html RSA的SecurID长的是这个样子滴: Mac里面,可以设置VPN, 方法 ...
- 用C#制作PDF文件全攻略
用C#制作PDF文件全攻略 目 录 前 言... 3 第一部分 iText的简单应用... 4 第一章 创建一个Document 4 第一步 创建一个Document实例:... 5 第二步 ...
- H5 移动调试全攻略
H5 移动调试全攻略 随着移动设备的高速发展,H5 开发也成为了 F2E 不可或缺的能力.而移动开发的重中之重就是掌握调试技巧,定 Bug于无形. 一.概要 因为移动端操作系统分为 iOS 和 And ...
- 【C#代码实战】群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法
若干年前读研的时候,学院有一个教授,专门做群蚁算法的,很厉害,偶尔了解了一点点.感觉也是生物智能的一个体现,和遗传算法.神经网络有异曲同工之妙.只不过当时没有实际需求学习,所以没去研究.最近有一个这样 ...
- TestLink安装全攻略
TestLink安装全攻略 此文章转自该链接--http://www.cnblogs.com/Tcorner/archive/2011/07/26/2117296.html 安装前准备 需要下载xam ...
- Android使用XML全攻略(2)
Android使用XML全攻略(2) Android 是针对移动设备的一种新兴的开源操作系统和 SDK.借助它,您可以创建功能强大的移动应用程序.当您的应用程序可以访问 Web 服务时,其吸引力会 ...
随机推荐
- 201521123090《JAVA程序设计》第二周学习总结
1. 本章学习总结 java基本数据类型 String类对象使用 枚举类型及switch分支 容器的概念 2. 书面作业 Q1.使用Eclipse关联jdk源代码(截图),并查看String对象的源代 ...
- evak购物车-课程设计(201521123034陈凯欣)
1.团队课程设计博客链接 https://i.cnblogs.com/EditPosts.aspx?postid=7047127 2.个人负责模块或任务说明 1.Java 编写商品类Goods,商品属 ...
- 201521123019 《java程序设计》 第14周学习总结
1. 本章学习总结 2. 书面作业 Q1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自己的学号.姓名) 在自己建立的数据库上执行常见SQL语句(截图) ...
- 201521123070 《JAVA程序设计》第12周学习总结
1. 本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...
- EGit使用教程:第一篇 添加工程到版本控制
配置 确定身份 当每次提交的时候,Git需要跟踪这次提交,确认是哪个用户提交的.用户由 user.name 和 user.email 组成,这个信息包含在 ~/.gitconfig 文件中. ~ 代表 ...
- PHP获取文件的绝对路径
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 ===========PH ...
- sessionStorage、localStorage 存储及如何存储数组与对象
1.存储,获取,清楚 sessionStorage.setItem("key",val) sessionStorage.getItem("key") sessi ...
- 第5章 不要让线程成为脱缰的野马(Keeping your Threads on Leash) ---线程优先权(Thread priority)
有没有过这样的经验?你坐在你的车子里,目的地还在好几公里之遥,而时间已经很晚了.你拼命想告诉那些挡住你去路的人们,今天这个约会对你是多么多么重要,能不能请他们统统--呃--滚到马路外?很不幸,道路系统 ...
- Rectangles hdu2461容斥定理
Rectangles Time Limit: 5000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- FPGA与Deep Learning
你还没听过FPGA?那你一定是好久没有更新自己在IT领域的知识了. FPGA全称现场可编程门阵列(Field-Programmable Gate Array),最初作为专用集成电路领域中的一种半定制电 ...