应用设计
当视频捕捉卡正确安装到系统中后,我们就可以使用代表捕捉卡的那个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
评论