最近有做一个从摄像头获取信息的程序, 期间查找了各种方案, 这里列出一些总结.
实现方案
avicap32.dll 的实现 Win32API
主要使用
capGetDriverDescriptionA
函数获取获取摄像头设备, 使用capCreateCaptureWindow
和SendMessage
发送一系列窗口消息控制, 图像数据使用一个PictrueBox
控件来显示, 有可以保存到avi文件.其属于Video for Windows技术, 代码示例可以参考How to Interface to a Video Device and Capture Video and Images, C#的代码示例可以参考_VideoCapturer.cs, 以及MSDN上的参考Video Capture
这个实现方法无法使用虚拟摄像头,
capGetDriverDescriptionA
不会返回任何虚拟摄像头设备.
DirectShow 的实现
这个实现的API使用起来比上面的要繁杂很多, 但是可以使用虚拟摄像头, 现在典型的IM软件其实现应该都是基于此.
没找到什么入门的介绍,只能从MSDN上DirectShow翻看
可以先从Introduction to DirectShow Application Programming了解典型的结构和流程,
Filter Graph Manager
是核心的部分, 以及 DirectShow System Overview, 结构图:DirectShow 视频捕获部分Video Capture
在dotnet下有一个DirectShow.Net库对DirectShow的封装, 可以直接在C#和VB.Net中直接使用, 文档仍旧需要以DirectShow的文档为主, 但是DirectShow.Net提供有大量的代码示例, 个别有些小问题, 但是简单改改都可以正常跑起来.
libVLC 的实现, 源自VLC播放器
VLC是跨平台的影音播放器, 除了能播放传统视频外, 还可以捕获视频, 具体的特性中有描述, 可以看到Windows下Video acquisition的实现是基于DirectShow
而libVLC是VLC播放器的底层库
在dotnet下有一个VLC的封装vlcdotnet, 也是开源的, 从介绍上可以看到能在WinForm, WPF, SilverLight 5下使用, 需要依赖libvlc.dll, libvlccore.dll, 安装VLC播放器后在安装目录下能找到.
Microsoft Media Foundation 的实现
MMF 这个其实没什么好讲的, 主要是只有Windows Vista及以后的才支持, 说是用来代替DirectShow的, 文档仍旧是以C++为主的, 在未来也许会比较有价值.
综述
最简单的是avicap32的实现.
需要支持虚拟摄像头, 或者是方便使用虚拟摄像头调试, 可以使用基于DirectShow的方案.
需要跨平台, 或者是涉及到音视频回放之类的可以使用基于VLC的方案.
MMF暂时周边相关的还不是很成熟, 除非环境允许能够使用这个方案.
我最后选择的使用DirectShow, 使用DirectShow.Net库, 代码麻烦了点, 但是有示例还是问题不大.