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

  • 相关阅读:
    MVVM架构~knockoutjs系列之表单添加(验证)与列表操作源码开放
    MVVM架构~knockoutjs系列之验证成功提示显示
    MVVM架构~knockoutjs系列之正则表达式使规则更灵活
    郁闷~win7无法进行局域网访问解决
    不合规范的html段落php处理细则
    备份一个通过拷贝来创建虚拟机镜像的脚本
    [置顶] ffmpg简介以及用它实现音频视频合并(java)
    [Java] HttpClient有个古怪的stalecheck选项
    POJ 1260 Pearls
    “AIR SDK 0.0: AIR SDK location “...devsdksAIRSDKWin” does not exist.”问题解决~
  • 原文地址:https://www.cnblogs.com/fighter23/p/13274066.html
Copyright © 2020-2023  润新知