,欢迎光临!
加入收藏设为首页请您留言
您当前位置:网站首页 >> 西北地区 >> DirectShow图像传输过滤波的设计与实现-上海联兵环保免费电话:400-600-5030

DirectShow图像传输过滤波的设计与实现-上海联兵环保免费电话:400-600-5030

2011-09-14 08:48:22 来源:空气过滤器_联兵环保 浏览:1
摘要微软公司的DirectShow开发包为开发高质量的多媒体软件提供了一个开放的平台。Fitter作为DirectShow的基本组成部分,扮演了一个十分重要的角色。简要介绍了DirectShow体系结构,并探讨了在此结构下开发满足特定需求的(Filter)组件的一般思路。同时,针对视频会议系统的需求,设计和实现了视频会议系统视频流接收和发送过滤器,并对实现的方法进行了简要的介绍。
关键词DirectShow过滤器针
中图法分类号 TP391. 72;  文献标识码 B
由于多媒体软件需要快速处理大量的不同格式的数据、音频和视频必须同步以及多媒体软件应尽可能地不依赖具体硬件(如某特定型号的声卡),等等[1],而传统的流媒体系统通常使用封闭的架构,这样系统的扩展性较差,并且不能充分地利用现有的资源。同时许多系统是基于专用的硬件,系统布置成本较高。针对这些问题,本文使用微软的DriectShow架构设计了基于IP多播的视频会议系统,实践证明,使用该架构有着结构简单,扩展性强等优点。同时,系统还可以充分地利用DirectShow架构下的各种过滤器,极大地加快了系统开发进度,降低系统开发地成本的同时提高了系统的可靠性。
1 DirectShow简介
为了应对多媒体处理中出现的各种问题,微软提出了DirectShow开发包。该架构提出的目的就是使数据传输、硬件兼容、流同步等底层处理相对于多媒件软件开发者来说是透明的,开发者只需将精力集中于项目的目标本身而无需了解底层细节就可以创建W indows应用平台上的多媒体应用程序,其具体的体系结构介绍如下。
1. 1体系结构
微软的DirectShow应用架构采用模组结构,该模组结构将多媒体数据的处理看成一条流水线,在流水线内含多道工序,而每道工序则由一种称为过滤器(Filter)的组件来完成。每个过滤器完成特定的功能,比如从数据源获取数据、编码、解码、压缩、解压缩等等。同时,微软提供了基于过滤器的多媒体应用程序框架,可以将这些既分工又合作的过滤器“装配”成一条流水线。这个功能由DirectShow中的GraphManager来实现。通过定义过滤器之间合作的“规范”,即它们之间的接口,不同处理阶段的不同过滤器之间的组合更具灵活性[2, 3]。
过滤器是基于组件设计的,经注册后成为操作系统的一部分,能够与操作系统完美结合,这是Di-rectShow架构的优越性所在。尽管如此,由于多媒体应用的巨大差异性, DirectShow架构提供的过滤器对某个具体的应用来说不一定是最优的,也不一定是现有的。为解决这个问题,微软将DirectShow设计成一种开放的架构,开发者可以按照预先制定的过滤器规范编制用于特定场合的过滤器,其行为和标准的过滤器一致,这样就使DirectShow成为了一种易于扩展的多媒体应用程序架构。
1. 2 过滤器图表的基本组成
DirectShow架构将多媒体“流水线”粗略地划分为三个阶段,每个阶段的任务由类型不同的过滤器完成,因而也就有了三类过滤器: (1)源过滤器,主要负责取得数据,数据源可以是硬盘上的文件、网络、摄像头等,接收数据后将其往下传输; (2)转换过滤器,主要负责多媒体数据的中间处理,如分流、编解码等; (3)提交过滤器,接收转换过滤器传来的数据并决定其最终去向,如播放、存储等。这三个阶段中每个阶段的工作还可以细分并由多个过滤器完成[4, 5]。其组织结构如图1所示。

DirectShow架构提供了用于完成上述三个阶段工作的通用的过滤器基类: CBaseFilter,定义了过滤器的典型属性和行为。从CBaseFilter派生出其他子类,如源过滤器的基类为Csource,转换过滤器的基类为CTransformFilter和TransInPlaceFilter,提交过滤器的基类为CBaseRender和CBaseVideoRender等。使用哪一种作为过滤器的基类取决于将要编制的这个过滤器要完成什么功能、在整个处理过程的哪一个阶段点等等。
1. 3 过滤器间的数据流程
过滤器作为类,它只提供了诸如启动、暂停、停止、质量控制这样一些宏观控制的方法。模块之间的交互真正涉及到的则是一个叫做针(Pin)的模组,对于每个过滤器,都拥有自身的针,它是由过滤器创建的对象,用于连接过滤器。针分为输入针和输出针,输入针把过滤器外部的数据接收到过滤器中准备处理,输出针把过滤器中处理后的数据传送到过滤器外部。通过针,数据从一个过滤器传送到另一个过滤器中。
对于一个过滤器,它通常包含一个或多个不同类型的针。对于源过滤器,只有输出针没有输入针;对于提交过滤器,只有输入针没有输出针;对于转换过滤器则既有输入针又有输出针。过滤器之间通过针完成连接以及数据处理、传输的任务。图1显示了一个过滤器连接图,其中输出针用白色矩形表示,输入针用黑色矩形表示。
过滤器之间能够连接,其首要条件是两个过滤器能就多媒体数据类型达成一致。DirectShow架构预先定义了众多的媒体类型,这些媒体类型首先分成几大主类型(majortype),各主类型里面又分为许多的子类(subtype)。媒体格式首先被分为视频和音频,其中视频又可以进一步分为MPEG、AVI等等。一个针可以同时支持多种媒体类型。
针提供了三个方法来完成过滤器之间媒体类型的协商: GeMt ediaType( )、CheckMediaType( )和SeMt ediaType( );其中GeMt ediaType ( )指出针自己支持的媒体类型, CheckMediaType()检查针是否支持其它针提供的媒体类型。媒体类型协商完成后,通过SeMt ediaType()设置针最终的数据类型。
如果两个针不能就媒体类型达成一致,它们之间将不能连接。
当两个过滤器就媒体类型达成一致后,就可以为数据传输作准备。过滤器有两种数据传输模式:推模式和拉模式。所谓推模式(push model),即源过滤器自己能够产生数据并主动将数据传给后面的过滤器。拉模式(pullmodel)过滤器不具备把自己的数据主动传输的功能,由后面的过滤器向其请求数据。推模式使用IMemInputPin接口,拉模式使用IAsyncReader接口。
在Directshow过滤器之间,数据是通过一个称为Sample的对象传输的,一个Sample可以看作是一块缓冲区,一个过滤器往Sample里写入数据,另一个过滤器从Sample里读出数据。图2说明了这一点。
在传输之前,两个过滤器要协商由谁提出Sam-ple,一个过滤器也可以强制让自己成为提供Sample的那个过滤器。接下来还要协商Sample的数目和大小,针提供了DecideBufferSize( )方法完成此功能, Sample的数目和大小取决于待处理的数据及其处理方式。
当上述准备工作都完成以后就可以进行数据传输了,当然数据传输的具体过程取决于过滤器的类型和传输模式。

2 视频会议系统传输过滤器的开发
本文的基于IP多播的视频会议系统由两大部分组成。图像来源于摄像头中的数据,图像数据在传输前由发送端用H. 264格式编码,接收端接收后解码。因此,系统的数据流程为:
发送端:摄像头捕获过滤器—H. 264编码过滤器—服务器端发送过滤器;
接收端:客户端接收过滤器—H. 264解码过滤器—VideoRender过滤器。
具体数据流程如图3所示。

由于捕获过滤器和视频显示过滤器DirectShow已经提供了成熟的版本,因此,本文的视频会议系统只需要编制H. 264编解码过滤器和传输过滤器部分。
H. 264编解码过滤器已经开发了一个初步的版本,限于篇幅,本文不详述。编制传输过滤器主要涉及到三个部分:过滤器、针、数据处理。它们之间的关系大致为:数据处理部分为网络传输和缓冲区的管理提供服务、针部分为过滤器的数据传输部分提供服务以及过滤器部分通过标准接口为应用程序提供服务[6]。
前面已经介绍, DirectShow为编写完成各种功能的过滤器提供了相应的过滤器、针的基类。本文只需在此基础上实现特定的要求(比如支持的媒体格式等等)并实现相应的数据处理部分即可。
2. 1 服务器端过滤器开发
在服务器端的数据流程中服务器端发送过滤器负责从H. 264编码过滤器中获取数据并将其通过网络发送给客户端。
服务器端过滤器的实现选择了的CBaseFilter作为过滤器的基类[7]。同时由于它仅有用作输入的针(接收压缩过后的图像数据),因此可以选择CBaseInputPin作为针的基类,按照DirectShow关于过滤器连接的规范,服务器端发送过滤器需要实现CBaseInputPin的GeMt ediaType方法声明其支持的数据格式(H. 264)。


上面介绍了服务器端过滤器中过滤器、针两个部分的实现思路,在该过滤器中,数据处理部分将完成多媒体数据的发送,该部分可通过windows环境下的W inSock网络编程实现。具体来说就是编写一个具有网络功能的类,实现监听连接、发送数据等功能。本文构造了一个CNeMt ediaSent来实现这些功能。
2. 2 客户端过滤器开发
客户端过滤器从网络上接收多媒体数据(H.264格式),然后将接收到的数据转化成为视频流数据,并传输给下一过滤器。
和服务器端过滤器一样,它可以选择CBaseFil-ter作为其过滤器的基类,同时它需要一个针用于输出给解压缩模块以便解压并显示,所以选择CBase-OutPutPin作为其Pin的基类。为了在GraphManag-er加载时告知其支持的数据格式,客户端过滤器同样需要实现CBaseOutPutPin的GeMt ediaType方法,与服务器端类似。
同时,如前所述,为了将接收到的数据传递给下一个过滤器(H. 264解码过滤器),过滤器之间应就它们所共享的缓冲区大小和数目达成一致,这通过CBaseOutPutPin的DecideBufferSize来实现。本文的接收端采用的是推模式且为源过滤器,所以必须作为提供并管理Sample的那个过滤器。简要代码如下:

客户端过滤器的数据处理部分是网络数据的接收,其实现方法与服务器端的实现方法相似。在这一部分中,为了保证一定的视听效果,网络多媒体传输一般都要采用缓冲技术,这涉及到双缓冲队列技术,这些功能是由CMediaReceiver的内部类CBufferPoolControl来完成的。
当过滤器编制好之后,可以通过regsrv32. exe组件注册程序将其注册到系统中,这时应用程序就可以直接调用它了。
3 小结
DirectShow为编写高质量的多媒体应用程序提供了开放性的框架。通过编制自己的过滤器可以使之更符合特定的需要,本文探讨了编制DirctShowFilter的一般思路。同时,针对视频会议系统的需求,本文设计和实现了视频会议系统视频流接收和发送过滤器。由于和操作系统紧密结合,本系统执行效率很高,对系统的资源的需求低,对于开发类似的系统有着一定的借鉴意义。

 

上海联兵环保科技有限公司
地址:上海市松江区工业区茸北分区茸阳路69号
总机:021-51691929
传真:021-57784244
免费电话:400-600-5030
技术支持:13641659499
E-mail:zhanglianbing@126.com
http://www.shlbhb.com

发表评论
网名:
评论:
验证:
共有0人对本文发表评论查看所有评论(网友评论仅供表达个人看法,并不表明本站同意其观点或证实其描述)
赞助商链接
关于我们 - 联系我们 - 咨询联兵