APP下载

DirectShow技术在W indows CE系统中的图像采集实现

2011-02-08陈浩明王小英

常熟理工学院学报 2011年4期
关键词:视频流窗体预览

王 辉,陈浩明,王小英

(常熟理工学院 计算机科学与工程学院,江苏 常熟 215500)

DirectShow是微软公司在ActiveMovie和Video for Windows的基础上推出的新一代基于COM(Component Object Model)的流媒体处理的开发包[1].它采用流水线的工作思想,可以实时处理并输出采集到的数据流,具有很强的时效性和灵活性.DirectShow屏蔽了硬件设备的差异性,降低了流媒体处理软件的开发难度,支持多种媒体数据类型的解码播放、格式转化,同时还具有VFW(Video for Windows)视频采集方式所不支持的多路音视频数据同时采集的功能,可以轻松地应用于视频监视系统、视频会议、视频点播等系统的开发[2,3].

目前随着嵌入式系统的普及,DirectShow被成功地移植到了Windows CE嵌入式系统之中[4],为Windows CE系统中的多媒体应用的开发提供了有力的支持.通过DirectShow技术,可以基于Windows CE嵌入式系统高效的开发OCR(Optical Character Recognition)(光学字符识别)产品,网络视频监视产品,网络视频会议播放产品等一些具有广阔市场前景的流媒体应用产品.

1 DirectShow系统框架

DirectShow是一个开放性的应用架构,如图1所示.应用程序在使用DirectShow时将按照一定的意图建立起相应的Filter Graph,通过Filter Graph Manager来控制整个数据处理过程.DirectShow在Filter Graph运行的时候接收各种事件,通过消息的方式发送到应用程序,实现应用程序与DirectShow系统之间的交互.

DirectShow中有三种Filter,分别是Source Filter,Transform Filter和Rendering Filter.Source Filters主要负责取得数据,数据源可以是文件、因特网、或者计算机里的采集卡、数字摄像机等,然后将数据向下传输;Transform Filers主要负责数据的格式转换、传输;Rendering Filters主要负责数据的最终去向,可以将数据传送至声卡、显卡进行多媒体的演示,也可以输出到文件进行存储.每个Filter都有其自己的连接Pin.Filter通过输入和输出Pin进行不同Filter之间的连接.

DirectShow采用了COM标准,在Direct-Show中提供了IGraphBuilder、IMediaControl、IVideoWindow等重要接口来完成视频流的采集与控制功能.使用DirectShow进行摄像头的视频流捕获时,首先需构建一个ICaptureGraphBuilder2和IGraphBuilder的COM对象,然后对摄像头驱动进行枚举,并将视频捕获滤镜与摄像头驱动建立关联,最终通过IGraphBuilder的对象查找IMediaControl接口和IVideoWindows接口实现预览窗体的设置和流媒体的基本控制.

图1 DirectShow系统框架

2 DirectShow在W indows CE上的实现

在Windows CE5.0以上的版本中都提供了可以直接调用摄像头的API函数,但是这些函数功能都过于简单,为此Microsoft公司又将DirectShow移植到Windows CE5.0以上的系统中,针对嵌入式设备的CPU的处理能力较弱以及嵌入式设备的内存容量较小的特点,Microsoft公司在移植DirectShow时也进行了必要裁剪,而这也导致了在Windows CE上进行DirectShow应用的开发相比于在PC机上的开发要有所不同.

本软件的开发使用Visual Studio 2005开发工具中的智能设备开发环境,语言选择了c++,因为c++可以自由地申请和释放内存,以节约嵌入式系统中的有限内存资源.在开发Windows CE应用程序之前,首先需要安装Windows CE的SDK,该开发包提供了DirectShow应用程序开发所需的库函数.

为了在工程里面能够正常地使用DirectShow,首先需要在工程中添加“dshow.h”头文件以及aygshell.lib和strmiids.lib两个静态库.由于DirectShow是基于COM开发,因此为了方便接口的调用和释放,可以使用智能指针CComptr<>,因此也需要添加atlbase.h这个头文件.

DirectShow在Windows CE系统上驱动摄像头,采集图像并保存的流程如图2所示.

本文在 Windows CE系统中通过DirectShow技术实现了视频捕获的应用软件,主要包括视频流采集与预览、视频流和图片保存、视频流格式设置以及预览窗体创建四个模块.

2.1 视频流采集与预览

该模块为整个软件的核心部分,其流程图如图3所示.在该流程中,查找摄像头的驱动并与视频捕获滤镜建立关联的方法不同于PC机上方式,因为Windows CE中的摄像头数目有限,不需要特意地去枚举视频捕捉设备,Windows CE的SDK中提供了FindFirstDevice函数,可以方便地查找到摄像头设备.

通过FindFirstDevice进行查找设备驱动时需要使用Windows CE中摄像头驱动的GUID,其GUID为{0xCB998A05,0x122C,0x4166,0x84,0x6A,0x93,0x3E,0x4D,0x7E,0x3C,0x86}.其实现代码如下:

图2 DirectShow在Windows CE上的图像采集

2.2 视频流和图片保存

在实现图片或视频保存时,DirectShow提供了设置视频或图片存储格式的功能,但是这些功能受到硬件条件的制约,并非每款设备上都能实现对视频或图片格式的设置.

对图片进行保存的核心实现代码如下:

图3 视频流捕获模块流程图

2.3 设置视频流格式与创建预览窗体

通过DirectShow技术可以比较简单地设置视频流的像素、采集频率以及图像的位数,不过这些参数的设置也需要硬件的支持才可以实现.视频格式的设置主要由IAMStreamConfig接口提供,该接口由ICaptureGraph-Builder2的COM对象获得,在Windows CE中可以使用 AM_MEDIA_TYPE和VIDEOINFOHEADER结构体来保存原始视频流格式以及设置后的视频流的格式.

DirectShow在进行预览摄像头采集的视频流之前需要先设置预览窗体,该窗体的接口通过滤镜管理器进行查询得出.控制视频窗体的接口为IVedioWindow,通过该接口可以设置视频窗体的风格,大小和所在窗体的位置.视频流能够正常运行还需要IGraphBuild的COM对象提供IMediaControl接口来进行控制,只有视频流进行了正常采集的时候,预览窗体才会进行视频流的实时显示.

3 系统性能分析

图4 DirectShow技术实现的系统

图5 设置显示窗体的大小

图4和图5分别是用DirectShow技术和系统自带的API函数实现的图像采集系统.采用DirectShow技术实现的系统其灵活性远远超过了采用系统自带的API函数实现的系统.该软件可以设置图像的分辨率、视频预览窗体的大小、视频的旋转、保存视频流或从视频流中捕获的图片,实现了视频采集应用的基本功能.同时,使用DirectShow自带的滤镜或者用户自定义的滤镜可以实现视频流的实时处理,还可以开发更为高级的应用功能,而使用Windows CE系统中自带的一些API时,只能调用系统自带的拍照程序,用户无法对其添加其他功能,也不能对实时的视频流进行处理,无法开发一些具有实际价值的应用.

除此之外,因为DirectShow只涉及到视频流的采集与处理,因此软件的界面可以由开发人员自由设计,而调用Windows CE自带的API函数时,开发人员无法对其软件界面进行修改.在进行单独的拍照测试时,使用DirectShow开发的视频采集软件的速度也要优于直接调用系统API函数开发的系统.

4 结论

本文研究了DirectShow技术的框架及关键技术,并在Windows CE系统中实现了视频流的图像采集、预览、处理、保存等功能,为今后在Windows CE嵌入式系统中开发视频监视系统、OCR系统,以及将Windows CE系统应用到摄像机、照相机等设备中提供了初步的技术验证.

[1]陆其明.DirectShow开发指南[M].北京:清华大学出版社,2009.

[2]唐芸,杜江红,陈继华.基于COM技术的DirectShow视频采集的研究[J].三峡大学学报(自然科学版),2003(6).

[3]黄振宇,王敏,吴涛.基于COM的Directshow Filter实现[J].微机发展,2004(5).

[4]邱小平.WindowsCE 6.0开发经典[M].北京:电子工业出版社,2009.

猜你喜欢

视频流窗体预览
边缘实时视频流分析系统配置动态调整算法研究
新品预览
基于视频流传输中的拥塞控制研究
试谈Access 2007数据库在林业档案管理中的应用
铁路货场智能大门集装箱全景图像采集方法研究
11月在拍电视剧预览表
美国视频流市场首现饱和征兆
bauma China 2014展前预览
巧设WPS窗体控件让表格填写更规范
WinCE.net下图形用户界面的开发