实现原理:
首先理解一下,什么是视频:视频实际是由一张一张的连续图片拼接而成,在一秒中播放的图片数量越多,则视频连续性越卡(即帧率)
那么录屏功能,可以理解为:连续的快速截图,再将图片组合为一个视频。
实际开发:
Accord是一个机器学习一个非常完成的库,如果需要详细了解,可以跳转至官方http://accord-framework.net/进行详细了解
但是本文只应用其中的Video功能实现录屏功能。
首先在NuGet的管理器中添加相关的包:Accord,Accord.Video,Accord.Video.FFMPEG.x64(PS:应为本人项目为64位,所以专门引用了64位,32位的为Accord.Video.FFMPEG)
需要使用其中的功能:1、屏幕截图功能;2、图片转视频
/// <summary>
/// 截屏工具
/// </summary>
Accord.Video.ScreenCaptureStream screenShot;
/// <summary>
/// 截屏转视频工具
/// </summary>
Accord.Video.FFMPEG.VideoFileWriter videoWriter;
/*初始化屏幕截图工具,尺寸设置为全屏录制*/
screenShot = new Accord.Video.ScreenCaptureStream(new Rectangle(0, 0, Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height));
/*初始化视频写入工具*/
videoWriter = new Accord.Video.FFMPEG.VideoFileWriter();
/*创建视频文件,并设置相关尺寸、帧率、视频格式、码率(影响清晰度)*/
videoWriter.Open("c:/temp.avi", Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height, 25, VideoCodec.MSMPEG4v3, 4000 * 1024);
/*截屏的频率,单位毫秒*/
screenShot.FrameInterval = 40;
/*截屏成功后写入视频*/
screenShot.NewFrame += (s, e1) =>
{
videoWriter.WriteVideoFrame(e1.Frame);
};
/*开始截屏*/
screenShot.Start();
/*停止截屏*/
screenShot.Stop();
/*停止视频写入*/
videoWriter.Close();
DEMO下载
链接:https://pan.baidu.com/s/1O7_cAaTB08bfUQgWupl_MA 密码:1fai
遇到一个问题:
Q:在某学校使用的品牌机中,调用的时候出现了如下的错误文件信息
****************************异常文本****************************
【出现时间】:2018/10/24 星期三 上午 10:56:20
【异常类型】:TypeInitializationException
【异常信息】:“<Module>”的类型初始值设定项引发异常。
【堆栈调用】: 在 ScreenShot.ScreenVideoForm..ctor()
在 ScreenShot.Program.Main() 位置 d:\documents\visual studio 2015\Projects\ScreenShot\ScreenShot\Program.cs:行号 30
***************************************************************
实际现象:Accord.Video.ScreenCaptureStream 对象无法实例化,实例化的时候就报错(具体原因未知)
A1:使用AForge.NET,官方网站(NUGET):http://www.aforgenet.com/framework/。但是没有找到64位的支持。
使用方式与Accord.NET完全一致。
A2:使用SharpAvi,官方地址(NUGET):https://github.com/baSSiLL/SharpAvi。我封装一个帮助类,直接可调用。
百度云盘,链接:https://pan.baidu.com/s/1-os5ODEBHMS3KquWavS7iQ 提取码:ha2f