WDM 视频捕获介绍
孙 涛
 
摘要:该文主要提供一些在Win98,win2K及以上操作系统中,进行Windows Driver ModelWDM)视频捕获的相关知识介绍。如果你对WDM视频捕获感兴趣,可以来看看这些东西。欢迎到我的博客blog.csdn/suntaoznz看其他文章!
 
Windos下视频捕获简史    1
    WDM和视频捕获    1
    VfWWDM Mapper    2
WDM 视频捕获结构    2
    DirectShow应用程序孙涛    3
    DirectShow Filter Graph    3
    WDM数据    4
  视频捕获 Minidrivers    4
    Pins, Streams, Formats    4
视频流命名约定    5
DirectShow 视频捕获的接口和属性    5
捕获数据流类型    6
  流输出数据格式    6
结束语
 
Windos下视频捕获简史
VFWVideo For Windows1.0版本在199211月发布,它是为在Windows3.1下将电影最优化地捕获到磁盘上而发布的。从那以后,视频捕获技术就越来越受到关注了。
  VFW技术同样受到了很多批评,它捕获的数据保存到磁盘上会占用大量磁盘空间,每秒数据量超过20M,同时需要大量的客户端支撑软件,VFW体系架构上的不足在视频会议应用上和PC/TV应用上被暴露无遗,这样就要求一种新的视频捕获技术来弥补这些不足。
    VFW的体系结构缺乏为视频会议,电视浏览,视频区域捕获和VBIVertical Blanking Interval)数据流提供强而有效的支持。一些视频卡等设备开发商在设计自己的产品时,针对这些缺陷,对VFW进行了功能扩展。由于没有统一的标准,我们的应用程序在使用这些扩充的功能时,就必须要写一些基于特定硬件的代码。这就意味着当要改变捕获驱动程序时,就必须要对显卡的驱动程序进行修改。
WDM和视频捕获
WDM 视频捕获设计就是为了来解决VFW体系结构中存在的这些问题。WDM视频捕获主要的好处体现在:
        可以为设备(如基于USBIEEE 1394通讯方式的摄像头 )提供32位的驱动程序。
        允许DirectShow WDM 流协同工作。
        可以在视频捕获设备和DVD/MPEG设备间,为硬件(如video ports chip sets)共享一个分类的驱动程序结构(Stream.sys)
        支持多个数据流。
        允许电视信号调频和输入选择。
        支持视频区域捕获,区域显示和VBI
        允许使用DirectDraw® VPE Video Port Extensions)管理视频输入。
 
在一个单独设备上可能会有多个组件共存的情况,这些组件包括DVD解码器,MPEG解码器,视频解码器,调谐器,音频解码器。WDM数据流就是用于解决这种情况而创建的。它是个统一的驱动模型,可以支持所有的这些设备和去处理它们的资源分配。
WDM数据流为标准数据类型和用户自定义数据类型提供了统一的数据模型,同样,它定义了大部分的标准设备的属性,并且根据需要可以很容易地实现扩充。因为按WDM数据流的协议,它支持在设备内核间进行数据传输,而不需要在用户模式下进行数据转换。这样可以获得较高的效率,减少不必要的工作。
操作系统仍然支持VfW驱动程序,但是依赖于VFW的开发将逐渐减少,这是因为下面三个原因: 
        WDM数据流为基于电视浏览和视频会议的捕获设备提供了优化支持。
        DirectShow提供了更强的功能。 
        Microsoft 将不会对VFW进行持续开发。
VfWWDM Mapper
VfWWDM mapperWindows 98 Windows 2000 操作系统的一部分。它提供了WDM 驱动程序到基于VfW程序的向后兼容。对于Windows 98, 有一个驱动程序文件和一个动态链接库Vfwwdm.drv Vfwwdm32.dllWindows 2000只要求一个DLL文件。典型的 mapper应用于显示视频捕获设备对话框、视频源选择对话框、摄像头控制面板和视频格式设置。
VfWWDM mapper 不是全面兼容并且不支持旧VFW的所有功能。例如不支持视频覆盖,也不支持视频端口implementations
WDM 视频捕获结构
WDM 视频捕获结构图如下:
 
DirectShow应用程序
DirectShow 用于控制多媒体数据流;它可以在运行时允许用户播放数字电影和对不同格式的声音进行解码,包括MPEG-1
这种播放性能可以让音视频卡支持Microsoft DirectX®APIDirectShow 同样可以播放AVI电影文件和Apple QuickTime (.mov)格式文件。
DirectShow 被广泛地应用于Windows 95, Windows 98, Windows 2000应用程序。DirectShow 直接和驱动程序通讯,DirectShow 不使用AVICap, 因为AVICap分配了数据缓冲区,如果一个DirectShow 层没有放在AVICap 顶层,那么缓存区数据必须要通过转化去指向它,这样会造成效率地下。
DirectShow Filter Graph
DirectShow结构定义了标准的组件去控制处理带时间标记(time-stamped)的多媒体数据流,这些组件被称为过滤器(Filter)。把这些Filter放在一个容器中,这个容器就是Filter Graph。可能有三种类型的FilterSource transform render。(注:有些资料将Filter翻译为过滤器,FilterGraph翻译为过滤器图表,这里我都用原单词
应用程序可以通过Filter Graph管理器来进行数据访问。Filter Graph 管理器会对Filter Graph配置进行管理,
同时还会通过Filter Graph控制数据的转移。Filter Graph 管理器提供了一套COM接口,去允许应用程序与Filter Graph实现通讯。
应用程序可以直接调用Filter Graph管理器接口去控制媒体流或者去获得Filter事件。还可以使用DirectShow ActiveXOCX控件进行程序设计。,还有一套MCI子集命令可以用来向后兼容Microsoft VFW 1.x版本和遵循OM-1 MPEG MCI 规范。
WDM数据流
WDM数据流主要应用包括视频捕获,电视浏览,VBI数据编码支持和DVD电影播放。DirectShow可以非常容易地使用这些数据。
 
视频捕获 Minidrivers
视频卡由一些组件构成,比如电视信号调谐器,AM/FM调谐器,视频解码器,音频解码器等,它们都由WDM Minidriver控制。使用Minidrivers ,就可以允许硬件开发商为不同的卡开发器驱动程序,他们只需要把Minidriver写到他们的卡上,当硬件设计修改后,不需要对修改驱动做更多的修改。
Windows 98 Windows 2000下,视频设备使用WDM Minidriver去控制视频数据流,视频捕获 Minidrivers 相当与一个客户端,它会去控制处理硬件设备的图像数据和其他相关数据。Minidrivers提供了如下的功能:
捕获压缩和非压缩的视频数据流,VBI数据,时间编码和其他辅助数据流。
控制视频流相关设备,比如电视信号调谐器,视频路由设备,电视音频控制器和视频压缩编码器。
在流内核中完成处理工作,减少操作过程提高效率。
Pins, Streams, Formats
数据流视频捕获驱动程序可以同时支持多个压缩数据,非压缩数据,时间编码, VBI解码数据以及自定义数据。为了保证每种数据同步匹配,捕获驱动程序为这些数据创建了一个新的数据流。每个流都会用一个WDM流针脚(Pin)来传递,通过针脚,单个数据流就可以把它的数据连接到不同的流Filter中去,还可以通过DirectShow 用户Filter的输出针脚,把数据转换输出给用户。(前面我们提到Filter3种类型:Source transform renderSource只有输出针脚,而transform有输入、输出2个针脚,render只有输入针脚)
每个针脚都可以支持多种不同的数据格式。比如,一个针脚它可以提供RGB16, RGB24, YVU9, JPEG 数字视频。针脚可以连接到一个共享的系统内存的数据缓存区,它还可以直接连接到硬件设备。
视频流命名约定
通常,DirectShow WDM 流会共享媒体的格式定义和流命名约定。但是基于内核模式(Kernel-mode
和用户模式(User-mode)下的命名约定有一些小的命名差异。比如,内核模式下的很多格式定义和GUID定义会在名称前加个”KS”前缀,BITMAPINFOHEADER就是用户模式下的定义,而KS_BITMAPINFOHEADER就是内核模式下的相同结构的定义。
在内核模式下,流格式使用KSDATAFORMAT数据结构。这个结构可以被扩展去包含其它特别的数据格式信息。
typedef union {
    struct {
      ULONG  FormatSize;
      ULONG  Flags;
      ULONG  SampleSize;
      ULONG  Reserved;
      GUID  MajorFormat;
      GUID  SubFormat;
      GUID  Specifier;
    };
    ULONGLONG  Alignment;
} KSDATAFORMAT, *PKSDATAFORMAT, KSDATARANGE, *PKSDATARANGE;
 
DirectShow 视频捕获的接口和属性
DirectShow 提供了与许多视频相关的接口,它们中的一些还有附带相关的属性。下面列出的这些接口是实际应用较多,并不带相关属性的:
        IAMAudioInputMixer
        IAMDroppedFrames
        IAMStreamConfig