C#视频采集方法对比

来源:互联网 发布:可以在线播放视频源码 编辑:程序博客网 时间:2024/04/30 08:55
作者:王先荣
前言
    随着Windows操作系统的不断演变,用于捕获视频的API接口也在进化,微软提供了VFW、DirectShow和MediaFoundation这三代接口。其中VFW早已被DirectShow取代,而最新的MediaFoundation被Windows Vista和Windows 7所支持。可惜的是,上述接口基于COM技术且灵活性很大,在.net中并不方便直接使用。
.net封装
    老外有很多活雷锋,他们奉献了不少的开源项目,DirectShow.net是对DirectShow的封装,而MediaFoundation.net是对MediaFoundation的封装。它们都能在http://sourceforge.net上找到。这两个封装之后的类库基本上跟原来的COM是一一对应的关系,可以用于视频捕获,但是用起来还是不够简便。
    通过不断的google搜索,我认为以下类库对视频捕获封装得不错,它们是:DirectX.Capture、OpenCv、EmguCv和AForge。
DirectX.Capture

    DirectX.Capture是发表在CodeProject上的一个项目,它能很方便的捕获视频和音频,在窗口预览,并将结果保存到文件。使用DirectX.Capture的示例如下:

Capture capture = new Capture( Filters.VideoInputDevices[0],                               Filters.AudioInputDevices[1] );capture.Filename = "C:\MyVideo.avi";capture.Start();//...capture.Stop();

但是,它没有提供单独获取某帧内容的方法。如果您只是需要预览并保存视频,它很好用。
OpenCv
    OpenCv对VFW和DirectShow的视频捕获部分进行了很好的封装,能够很方便的获取到某帧的内容,也可以将结果保存到视频文件中。使用OpenCv的示例如下:

OpenCvIntPtr ptrCapture = CvInvoke.cvCreateCameraCapture(param.deviceInfo.Index);            while (!stop)            {                IntPtr ptrImage = CvInvoke.cvQueryFrame(ptrCapture);                lock (lockObject)                {                    stop = stopCapture;                }            }            CvInvoke.cvReleaseCapture(ref ptrCapture);
不过OpenCv并未对音频捕获进行封装,如果需要同时录制音频,这个搞不定。
值得注意的是,从OpenCv 1.1开始已经实现了对DirectShow的封装,这跟网上很多人所说的OpenCv使用VFW进行视频捕获效率低下这种观点不一致。关于OpenCv使用DirectShow的论据请看本文的附录。

EmguCv
    EmguCv是对OpenCv在.net的封装,继承了OpenCv快速的优点,同时它更加好用。使用EmguCv的示例代码如下:


EmguCv            Capture capture = new Capture(param.deviceInfo.Index);            while (!stop)            {                pbCapture.Image = capture.QueryFrame().Bitmap;                lock (lockObject)                {                    stop = stopCapture;                }            }            capture.Dispose();


AForge
    AForge是一套纯正的.net开源图像处理类库,它的视频捕获类也是基于DirectShow的,但更加好用,功能更多,从使用和帮助来看更类似微软的类库。

AForge

 

对比
    介绍完它们之后,我们来比较下它们。它们都是基于DirectShow的,所以性能几乎一样。实际上,我个人认为,摄像头所用的硬件和驱动程序的支持对性能影响更大。我的摄像头在Windows 7下没有专门的驱动程序,只能使用Microsoft提供的默认驱动,性能比WindowsXp要差一截。
值得注意的是主要有几点:
    (1)只有DirectX.Capture实现了对音频的捕获;
    (2)只有DirectX.Capture不能获取单独的某帧图像;
    (3)EmguCv的免费版基于商业许可,而其他类库的许可都很宽松;
    (4)AForge的示例和帮助比较好,而且功能多些。


附录:OpenCv也用DirectShow来捕获视频
通过分析OpenCv 2.0的源代码,我得出了OpenCv使用DirectShow来捕获视频的结论。证据如下:


DirectShow In OpenCv(1)//_highgui.h  line:100#if (_MSC_VER >= 1400 || defined __GNUC__) && !defined WIN64 && !defined _WIN64 #define HAVE_VIDEOINPUT 1#endif(2)//cvcap_dshow.cpp  line:44#ifdef HAVE_VIDEOINPUT#include "videoinput.h"/********************* Capturing video from camera via VFW *********************/class CvCaptureCAM_DShow : public CvCapture(3)//cvapp.cpp  line:102CV_IMPL CvCapture * cvCreateCameraCapture (int index){//.....//line:140 switch (domains[i]) {        #ifdef HAVE_VIDEOINPUT        case CV_CAP_DSHOW:            capture = cvCreateCameraCapture_DShow (index);            if (capture)                return capture;            break;        #endif


原文地址

http://www.cnblogs.com/xrwang/archive/2010/02/13/HowToCaptureCameraVideoViaDotNet.html



0 0