几款视频类库的对比
来源:互联网 发布:win8 怎么安装ubuntu 编辑:程序博客网 时间:2024/05/29 11:20
前言
随着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的示例如下:
IntPtr 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的示例代码如下:
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来捕获视频的结论。证据如下:
本文完整源代码
- 几款视频类库的对比
- 几款视频类库的对比
- 几款ARM芯片的对比
- 几款程式语言软件的对比
- 几款主流 NoSql 数据库的对比
- 几款模板引擎的性能对比
- 几款主流 NoSql 数据库的对比
- 几款主流 NoSql 数据库的对比
- 几款主流 NoSql 数据库的对比
- 几款常用T类芯片对比
- 对比几家的翻译
- 电力电子领域的几款软件的对比分析
- 几款常用的接口测试工具的对比
- 几款基于AJAX的网页操作系统(WebOS)对比
- 主题:几款模板引擎的性能对比
- Java几款性能分析工具的对比
- Java几款性能分析工具的对比
- Java几款性能分析工具的对比
- Copying to tmp table 解决方式
- Linux下打包压缩war,解压war和jar命令
- 让div高度跟随窗口高度自适应的方法
- Android Studio 下安卓 jni 开发错误 undefined reference to __android_log_print
- 移动端之在不同尺寸大小的手机上展示同一效果解决方案(修正二) by FungLeo
- 几款视频类库的对比
- "围观"设计模式(5)--迪米特法则(Lod,Law of Demeter)或最少知道原则(Least Knowledge Principle)
- Android 继承BaseActivity的典型用法
- web.xml is missing and <failOnMissingWebXml> is set to true[解决]
- webservice实例
- Objective-C中的布尔类型的用法
- java中volatile关键字的含义
- error C2039: “sort”: 不是“std”的成员
- Maven 常用命令收集