AForge.Net C#的操作视频,照片读写功能
AForge.Net C#的操作视频,照片读写功能
作者
关键词
摘要
引言
背景
最近在学习人脸识别,最趁手的还是.Net,所以还是现在C#的怀抱里学习了解了。第一站就是AForge。
需求
基本的视频操作:
现状
维护到2013年,不知道有没有更新的中间件了。
必要性
预期目标
自如的控制视频,图片等。
实现
主要技术背景
配合AForge的控件和视频设备或者文件使用,将视频设备或者文件作为源,即可实现。感觉很方便,很符合C#的操作习惯
设计思路
拖一个视频控件,然后获得视频设备信息,将视频设备作为控件的源,就可以显示了。
基本操作
1 准备工作
using AForge.Video.DirectShow;
private FilterInfoCollection filterInfoCollection;
private VideoCaptureDevice rgbVideoDevice;
同时,你拖一个视频控件到winform上。
2 获得设备信息
filterInfoCollection = new FilterInfoCollection(FilterCategory.VideoInputDevice);
3 实例化视频设备
if(rgbVideoDevice!=null)
{
rgbVideoDevice=new VideoCaptureDevice(((FilterInfo)filterInfoCollection[0]).MonikerString);
}
4 关联控件源和设备,并开始
vsp1.VideoSource = rgbVideoDevice;
vsp1.Start();
5 播放视频(使用视频作为源)
先定义一个源。
private FileVideoSource fileVideo;
用文件路径实例化一个文件源
fileVideo = new FileVideoSource("hhha1.avi");
关联控件源并开始
vsp1.VideoSource = fileVideo;
vsp1.Start();
进阶操作
保存图片
if(rgbVideoDevice.IsRunning)
{
currentpic = vsp1.GetCurrentVideoFrame();
string filepath1 = @"hhha1.jpg";
currentpic.Save(filepath1);
//pictureBox1.Image = Image.FromHbitmap(currentpic.GetHbitmap());//为啥要有这样一个转换?
}
录制视频
这个稍微麻烦一点,还有几个坑
坑就不详细介绍了,给个链接跳坑链接
通过 VideoFileWriter进行操作。
private VideoFileWriter writer;
实例化一个VideoFileWriter
开始录制。
writer = new VideoFileWriter();
然后通过writer将文件和视频控件链接起来
string filepath1 = @"hhha1.avi";
if (rgbVideoDevice.IsRunning)
{
writer.Open(filepath1, width, height, fps,VideoCodec.MPEG4);
}
相当于打开文件的口袋,这样还不能保存视频,还需要有个引擎或驱动将视频的每一帧推到文件里。因为是一个引擎,他需要在录制期间一直工作,所以我们需要一个一直运行的事件来做这个事情,一个简单的办法是通过视频控件的paint来实现。
首先我们需要一个推送的函数
private void writeVideo2file(Bitmap img1)
{
//if(isWriter&&writer.IsOpen)
if (writer.IsOpen)
{
writer.WriteVideoFrame(img1);
}
}
当然也可以将writer作为参数,以便获得更高的灵活性。
然后就可以让视频控件的paint事件帮我们推到文件里了
private void videoSourcePlayer1_Paint(object sender, PaintEventArgs e)
{
if(vsp1.IsRunning)
{
using (Bitmap img1 = vsp1.GetCurrentVideoFrame())
{
writeVideo2file(img1);
}
}
}
当然你还得记得关掉writer
if(vsp1.IsRunning)
{
vsp1.SignalToStop();
}
注意事项
winfrom的closed事件记得要关闭设备
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
if(vsp1.IsRunning)
{
vsp1.SignalToStop();
}
}
结束语
简单好用。虹软的demo就是结合这个控件来完成。
写完这个东西,就再研究下虹软的详细操作。