netwjx

混乱与有序

捕获摄像头信息

| 评论

最近有做一个从摄像头获取信息的程序, 期间查找了各种方案, 这里列出一些总结.

实现方案

  1. avicap32.dll 的实现 Win32API

    主要使用capGetDriverDescriptionA函数获取获取摄像头设备, 使用capCreateCaptureWindowSendMessage发送一系列窗口消息控制, 图像数据使用一个PictrueBox控件来显示, 有可以保存到avi文件.

    其属于Video for Windows技术, 代码示例可以参考How to Interface to a Video Device and Capture Video and Images, C#的代码示例可以参考_VideoCapturer.cs, 以及MSDN上的参考Video Capture

    这个实现方法无法使用虚拟摄像头, capGetDriverDescriptionA不会返回任何虚拟摄像头设备.

  1. DirectShow 的实现

    这个实现的API使用起来比上面的要繁杂很多, 但是可以使用虚拟摄像头, 现在典型的IM软件其实现应该都是基于此.

    没找到什么入门的介绍,只能从MSDN上DirectShow翻看

    可以先从Introduction to DirectShow Application Programming了解典型的结构和流程, Filter Graph Manager是核心的部分, 以及 DirectShow System Overview, 结构图:

    High level architecture

    DirectShow 视频捕获部分Video Capture

    在dotnet下有一个DirectShow.Net库对DirectShow的封装, 可以直接在C#和VB.Net中直接使用, 文档仍旧需要以DirectShow的文档为主, 但是DirectShow.Net提供有大量的代码示例, 个别有些小问题, 但是简单改改都可以正常跑起来.

  2. libVLC 的实现, 源自VLC播放器

    VLC是跨平台的影音播放器, 除了能播放传统视频外, 还可以捕获视频, 具体的特性中有描述, 可以看到Windows下Video acquisition的实现是基于DirectShow

    libVLC是VLC播放器的底层库

    Technical Diagram

    在dotnet下有一个VLC的封装vlcdotnet, 也是开源的, 从介绍上可以看到能在WinForm, WPF, SilverLight 5下使用, 需要依赖libvlc.dll, libvlccore.dll, 安装VLC播放器后在安装目录下能找到.

  3. Microsoft Media Foundation 的实现

    MMF 这个其实没什么好讲的, 主要是只有Windows Vista及以后的才支持, 说是用来代替DirectShow的, 文档仍旧是以C++为主的, 在未来也许会比较有价值.

综述

  1. 最简单的是avicap32的实现.

  2. 需要支持虚拟摄像头, 或者是方便使用虚拟摄像头调试, 可以使用基于DirectShow的方案.

  3. 需要跨平台, 或者是涉及到音视频回放之类的可以使用基于VLC的方案.

  4. MMF暂时周边相关的还不是很成熟, 除非环境允许能够使用这个方案.

我最后选择的使用DirectShow, 使用DirectShow.Net库, 代码麻烦了点, 但是有示例还是问题不大.

评论

Fork me on GitHub