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的,但更加好用,功能更多,从使用和帮助来看更类似微软的类库。
对比
介绍完它们之后,我们来比较下它们。它们都是基于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
- C#视频采集方法对比
- C# 如何采集摄像头的视频
- 视频图像数据采集方法研究
- MTK视频预览和采集方法
- linux v4l2 摄像头采集视频的方法
- linux v4l2 摄像头采集视频的方法
- 今日头条视频采集方法
- linux v4l2 摄像头采集视频的方法
- 视频采集
- c# 网页采集类 (方法)
- 在C#中利用ActiveX控件进行视频采集
- c#实现摄象头视频采集,拍照,录象
- 在C#中利用ActiveX控件进行视频采集
- c# 2.0实现摄象头视频采集,拍照,录象
- C#结合天敏VC4000采集卡视频监控
- 在C#中利用ActiveX控件进行视频采集
- c# 2.0实现摄象头视频采集,拍照,录象
- C# WinForm DirectShow视频采集及图片抓取实例DxSnap
- JavaScript中的NaN英文全称
- 数据结构与算法12:单源最短路径Dijkstra算法
- Android 音乐播放器的实现(三)Service的实现
- 2013年学习总结
- MIPI学习
- C#视频采集方法对比
- 深入理解read(byte[] b)与readFully(byte[] b)
- 我的c++笔记[4]
- linux:关于Linux系统中 CPU Memory IO Network的性能监测
- windows 不能在本地计算机启动apache2。有关更多信息,查阅系统事件日志。如果这是非Microsoft服务,请与服务厂商联系,并参考特定服务错误代码1
- 快速迭代式开发使用方法总结
- JavaScript实现的类似腾讯QQ聊天窗口抖动效果
- 设计模式10--原型模式(Prototype)
- 【java script】学习------js基础