c#屏幕录制(经典)(含源码和
AForge.Video.FFMPEG.DLL)及填坑办法
⼀直觉得在多媒体处理⽅⾯渣得不⾏。最近需要做⼀个摄像头的程序,为了⽅便,⽤了AForge这个开源项⽬。AForge项⽬中有AForge.Video和AForge.Video. DirectShow这两个⼦项⽬,可以⽅便的调⽤摄像头。但是这两个项⽬最终只能取得视频帧,并不能保存为视频⽂件。经⾼⼈指点,AForge还有⼀个⼦项⽬AForge.Video.FFMPEG,它可以将图⽚压制成Avi视频格式。不过这个
AForge.Video.FFMPEG在实际使⽤的时候会遇到不少坑,下⾯我将我在这次使⽤中遇到的坑分享给⼤家。
AForge.NET是⼀个专门为开发者和研究者基于C#框架设计的,该库是⼀个开源项⽬,他包括计算机视觉与⼈⼯智能,图像处理,神经⽹络,遗传算法,机器学习,模糊系统,机器⼈控制等领域,提供很多图像的处理,和视频处理功能
这个框架由⼀系列的类库组成。主要包括有:
AForge.Imaging —— ⼀些⽇常的图像处理和过滤器
AForge.Vision —— 计算机视觉应⽤类库
AForge.Neuro —— 神经⽹络计算库AForge.Genetic -进化算法编程库
AForge.MachineLearning —— 机器学习类库
AForge.Robotics —— 提供⼀些机器⼈的⼯具类库
AForge.Video —— ⼀系列的视频处理类库
AForge.Fuzzy —— 模糊推理系统类库
AForge.Controls—— 图像,三维,图表显⽰控件
  Aforge.Net⼦项⽬有个AForge.Video.VFW提供了对Avi⽂件的操作,AForge后⾯加⼊了⼦项⽬ AForge.Video.FFMPEG 通过FFmpeg库,提供了对⼤量视频格式的⽀持,我们都知道,FFmpeg是⼀个⾮常强⼤的视频处理类库,同样也是开源的,不
过 AForge.Video.FFMPEG 还处于实验阶段,⽬标是⽤ FFmpeg 取代 AForge.Video.VFW 提供⼀个更好的对视频⽂件操作的库,但是该库值⽬前提供了对视频数据的读写,不⽀持对⾳频⽂件的读写,可能以后会⽀持
第⼀坑:引⽤
你要⽤AForge.Video.FFMPEG,当然第⼀步是引⽤啦。但这个AForge.Video.FFMPEG并不能像AForge其他项⽬⼀样可以⽤Visual Studio⾃带的NuGet去获得,你会发现NuGet上根本不到这个项⽬。
不到么,那我就去官⽹好了,咱们可以去AForge项⽬官⽹下载AForge项⽬的源码和已编译⽂件。不过这⾥有俩问题:
1.
2. AForge项⽬的源码和⽣成⽂件最终都是放在GoogleCode上的,国内你懂得。不过这边我们就可以⽤的⼩花招就是⽤迅雷之类的下载
器下载,他们的离线下载是可以的。
下载下来之后是⼀个压缩包,AForge.Video.FFMPEG.dll就放在压缩包的Release⽂件夹中。
第⼆坑:调⽤
刚刚我们从官⽹下载下来了AForge.Video.FFMPEG.dll,接下来调⽤就好了对吧。
然⽽并不是,你只是⼀脚踏进了⼀个深坑罢了,为什么说是深坑呢?因为这个dll调⽤⾮常⾮常的恶⼼。
我们来看⼀下有多恶⼼,⾸先我们假设我们已经在项⽬中已经添加了AForge.Video和AForge.Video.FFMPEG这⼆个类库。
然后修改Main函数:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleRecoderTest
{
class Program
{
static void Main(string[] args)
{
ScreenRecorderTemplate tmp = new ScreenRecorderTemplate()
{
IsStartUp = false,
StartDateTime = DateTime.Now,
StopDateTime = DateTime.Now.AddMinutes(2)
};
new ScreenRecorderTool(tmp).StartRecording();
Console.WriteLine("complete");
Console.Read();
}
}
}
按F5调试,瞬间爆炸:
发⽣这个问题的原因⽐较简单,因为这个AForge.Video.FFMPEG使⽤VC++写的,编译的时候已经被编译成本地代码,⽽我们现在C#⼀般⽬标平台都是“Any CPU”,所以会发⽣这个问题。
getsavefilename
解决⽅案就是不再选择使⽤“Any CPU”作为⽬标平台,改成“x86”或者“x64”。因为x86可以跑在x64上,⽽x64不能在x86上跑,所以我选择了x86。
现在再按F5启动调试,再⼀次瞬间爆炸【冷漠脸】。
怎么说呢,起码出错提⽰换了对吧【冷漠脸】。
那么这次⼜是出什么问题了呢。
咱们现在⽤的是AForge.Video.FFMPEG对吧。我们都知道FFMPEG是⼀个著名的开源多媒体处理项⽬对吧,这个
AForge.Video.FFMPEG其实是在内部调⽤FFMPEG来⼯作的。所以这个FileNotFoundException其实是AForge.Video.FFMPEG不到FFMPEG的⽂件所以抛出来的。AForge.Video.FFMPEG依赖的FFMPEG组件其实已经放在了刚刚下载下来的压缩包的
\Externals\ffmpeg\bin⽬录下:
我们把这个8个⽂件复制到程序⽬录下,注意我们刚刚改过⽬标平台了,现在程序编译输出的⽬录已经是\bin\x86\Debug,不要复制错了。
复制好之后我们继续按F5调试程序。
嗯,爆炸了,我已经习惯了【冷漠脸】
这次问题的原因是什么呢……
其实是因为我的项⽬⽬标框架是 Framework 4.0,⽽AForge官⽅在编译AForge.Video.FFMPEG.dll的时候,⽬标框架选的是 Framework 2.0……

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。