DirectShow视频捕捉应用研究

来源:互联网 发布:linux创建目录 编辑:程序博客网 时间:2024/05/23 05:08

摘要 本文将对从捕捉设备和从播放文件中进行视频捕捉涉及的有关驱动(Driver)与应用的模型和接口进行研究和分析,比较其Windows与Windows CE中的不同,从而提出在Windows CE下实现视频捕捉数据流的方法。

  关键字 DirectShow,视频捕捉,驱动,Windows CE系统

  引言

  随着多媒体技术的不断发展,相应的软件与硬件层出不穷,现在与多媒体视频会议(Video Conference)、视频对话相关的软硬件正成为人们关注和谈论的热点应用。而在这些应用中无不涉及视频数据的捕捉。

  视频捕捉

  1、从工具上讲:一般从宏观上我们讨论的视频捕捉都是指的我们依赖于一定的软件和硬件快速获取和处理音/视频数据,实现照相、抓图、字幕、视频翻转/镜像等操作。

   视频捕捉硬件一般有:视频捕捉卡、摄像头(CAMERA)、摄像机或称摄影机(DV)等;

   视频捕捉软件是指相应捕捉硬件的驱动程序和实现捕捉、回放功能的应用软件。如:HyperCam,iuVCR ,WinCAM 2000 等。

  2、静态和动态视频捕捉

   静态视频捕捉成的一般为图片文件,如.BMP的文件等,其分辨率的大小可以通过程序或设备属性设定。

   动态视频捕捉的可以是.WAI等具有连续动作的视频低自定格式的文件,用一般的播放软件可以播放。

基于DirectShow的视频捕捉过程

  1、DirectShow技术

  在一般的软件开发工具中(比如VB,VC)都可以直接调用windows系统下的MCI控制接口)函数或者媒体播放控件(WMP等),设定相关的文件名等属性就可以实现视频的捕捉或回放。随着多媒体技术的迅速发展,各种压缩算法在该领域的应用,MCI技术越来越显的力不从心,最明显的是它不支持可变比特率的压缩算法,对于处理DVD等近年出现的多种新的媒体格式已显得无能为力。随后,微软又适时推出了建立在DirectX(包含DirectDraw、DirectSound、Direct3D)之上的DirectShow技术,它也是一种API(应用程序接口),每个DirectX部件都是用户可调用的API的总和,通过它应用程序可以直接访问计算机的硬件。支持来自本地或网络的各种视频、音频压缩格式的媒体文件的解码和回放,可以从设备上捕捉多媒体流,也可以处理各种压缩算法处理的流媒体。这些格式包括:MPEG的音频和视频标准、音频和视频交互标准(AVI)、WAVE、MIDI和高级流格式ASF。

  DirectShow包含了三种标准COM组件(一般称为过滤器—Filter):Source filter、Transform filter、Renderer filter来处理流媒体数据。Filter带有输入、输出针角(pin),或二者兼而有之。Filter通过向文件读写、修改数据和显示数据到输出设备上来操作流媒体。为了完成整个任务,必须要将所有的Filter连接起来,这三种Filter组成了过滤器图表管理器(Filter graph manager),如图1所示:


图1 过滤器图表结构(Filter Graph Manager)

  从图1中可以看出,Filter graph manager是各种过滤器的集合,它是通过各Filter的输入输出"pin"顺序连接而成的,这些Filter的pin通过协商来决定它们将支持何种形式多媒体。

  2、从视频设备进行的视频捕捉

  在DirectShow的filter中,有一类Capture Filter,它一般代表的是捕捉卡等硬件设备,其实它就是DirectShow与设备的Driver之间的接口。因为Filter通过DeviceIoctl函数实现交互,使得应用程序员可以通过DirectShow的Filter直接与捕捉设备的Driver进行通信。
其模型如图2:


图2视频捕捉体系(VideoCaptureAchitecture)

  我们只需将Capture Filter加入Filter Graph中,在通过其提供的接口函数就可以捕捉我们需要的视频或音频数据。

  3、在媒体播放过程中的视频捕捉

  Sample Grabber Filter是Transform filter的一种,它提供了一些接口能够检索(retrieve)在Filter Graph中传递的数据样本(samples),从而实现对播放过程中数据流的控制。比如通过IsampleGrabber::GetCurrentBuffer就可以得到当前的图像帧,进而将其保存为文件或者显示在指定的地方。

  开发人员也可以通过编写自己的Filter来扩展DirectShow对媒体的支持功能,例如:在微软的DirectX技术中不提供MPEG2 Decoder Filter,换句话说,必须提供第三方的MPEG2 Decoder,这个“第三方的MPEG2 Decoder Filter”就是必须我们自己编写或者从别的厂商处购买;其中就包括Video/Audio Decoder Filter。有很多软件厂商就是经营这种产品的。
应用设计

  当视频捕捉卡正确安装到系统中后,我们就可以使用代表捕捉卡的那个Capture Filter。如图3:


图3

  1、Capture Filter的创建也不象其他Filter一样使用CoCreateInstance就可以,而是先创建一个系统设备(System Device Enumerator)枚举器,从中选择代表Capture设备的Capture Filter;然后与添加别的Filter一样调用IFilterGraph::AddFilter就可以将Capture Filter加入Filter Graph。

  2、上一步之后,剩下的Filter使用ICaptureGraphBuilder2接口依次连接到Filter Graph中,最终形成一个完整的Filter Graph Manager。要实现视频捕捉到文件,可用ICaptureGraphBuilder2::RenderStream方法,指定相应的输出文件路径等参数即可。

  3、要具体细致的话,还可以在Filter Graph链路中加入Crossbar Filter(用于选择捕捉卡或捕获设备的输入端子,一般有三种:AV、S-Video、TV)。它的加入方法与Capture Filter类同。

  在Windows CE中的思考与设想

  就像Windows CE的Win32 API只是Windows的Win32 API的子集一样;Windows CE中的DirectX SDK没有Capture Filter 这类代表Capture Device的Filter,也没有ICaptureGraphBuilder,要进行视频捕捉,只有自己手动配置DirectShow application各项元素用于媒体捕捉。这就需要一个Source filter从Driver中接收原始(Raw)数据,即让Raw data=>Source filter=>Encoder(decoder)=>File writer这样进行捕获。但是Windows CE中并没有自带有这样支持媒体捕捉的Source Filter和File writer。所以我们必须从底层的Driver入手,分析他们之间的关系和接口。从而为我们编写Source Filter和File Writer提供线索。

  在DirectShow中都提供了一种叫ksproxy的代理Filter,它代表了各种类型的WDM 流设备,硬件制造商(IHV)们通过扩展这中Filter,封装为一种叫ksproxy plug-in的COM对象(通常实现的是与下层驱动的流接口即是一种Stream Interface)来提供特定的功能,这些下层通信的实现几乎都包括在我们的Driver中。而对应用程序开发者来说,都可以通过DeviceIoControl和CreateFile函数完成对Driver及设备的控制和访问,并且可以通过RequestDeviceNotifications函数查询和管理设备提供的接口。再根据接口函数实现直接对设备在Driver中的数据流进行控制的目的。其后还可以通过DeviceIoControl和WriteFile对捕捉的数据流进行操作。其中CreateFile的过程可以封装在待开发的Source Filter中,而WriteFile的过程可以封装在File writer中。其目标模型如图4:


图4WDM Video Capture Architecture

  结束语

  本文将对从捕捉设备和从播放文件中进行视频捕捉涉及的有关驱动与应用的模型和接口进行了分析,比较了其Windows与Windows CE中的不同,提出了在Windows CE下实现视频捕捉数据流的方法。从而得出一个结论是:由于现在Windows CE在嵌入式系统中应用越来越广,而它所提供的功能函数肯定没有Windows全,所以我们在遇到类似问题时都应该想到运用系统提供的函数重构自己的函数,并将其模块化、构件化。这必将是软件开发的一个趋势。

  参考文献:

  1、 Microsoft DirectX9 SDK & Microsoft Windows CE .NET 4.2 SDK

  2、 陈向群 王雷 等,Windows CE .NET系统分析及实验教程,机械工业出版社,2003.1

  3、 David J.Kruglineki等,Visual C++ 6技术内幕,北京希望电子出版社 ,1999.5
 

原创粉丝点击