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就是结合这个控件来完成。
写完这个东西,就再研究下虹软的详细操作。

posted @ 2020-07-09 15:42  天空-青岛  阅读(1581)  评论(0编辑  收藏  举报