摘 要:远程视频监控系统在各个领域都有着广泛的应用,是当今大型企业、银行、厂矿等信息交流广泛的企业生产和管理的必备系统。如何将多个现场的监控数据方便、高效地通过计算机网络传送到监控主机上,是远程视频监控系统需要解决的一个主要问题。因此,在远程视频监控系统的开发中,最关键的部分是网络通信模块的设计。笔者在银行远程视频监控系统的开发过程中,采用VisualC++编程工具,运用面向对象的程序设计思想和DirectShow技术,实现了以组播方式的多路视频的远程监控和传输。
关键词:远程视频监控;网络通信;模块;DirectShow;过滤器;COMIP组播 一、网络通信模块的设计 系统的网络通信模块的主要功能是以组播方式发送和接收网络视频流,它的实现主要是网络传输过滤器的开发,包括网络发送过滤器和网络接收过滤器2个部分,如图1所示。网络发送过滤器用于处理经压缩编码过滤器编码后的视频流,将数据流分块打包后发送出去;网络接收过滤器用于从网络获取媒体数据并将数据传送到下一级解码过滤器。因此,网络通信模块设计的关键是网络通信过滤器的开发。 二、过滤器开发技术 在对网络通信系统的过滤器设计中,由于媒体格式、压缩方式、硬件属性等方面的特殊要求,使用开发软件自带的标准过滤器往往不能满足要求,用户经常需要自行开发过滤器,因此,就引入了过滤器开发技术。DirectShow是微软公司推出的新一代基于COM的流媒体处理的开发包,提供了很多标准过滤器(Filter)供用户直接使用,同时为过滤器组件开发提供了一套基类库(BaseClassLibrary),包括过滤器基类、针脚基类和一些辅助类。基类库为过滤器组件的开发提供了一个框架,省去了复杂的底层编码工作,因此,本文选择DirectShow开发过滤器组件,主要工作集中在以下2个方面:传输和处理媒体流;将过滤器封装为COM组件。 1.媒体流的传输和处理 为了传输数据,用户过滤器首先要与过滤器图中其它过滤器连接起来。连接时要进行媒体格式和内存分配器的协调。过滤器之间通过针脚相连。过滤器之间媒体格式和内存分配器的协调实际上是通过针脚之间的通信完成的。主动连接方的过滤器的针脚首先获取自身支持的所有媒体格式,然后将其中1种格式送交给被动连接的一方。被动方的针脚进行判断:如果被动方支持该格式,媒体格式协调成功;如果被动方不支持该格式,就通知主动方,主动方再提供1种不同的格式送交被动方,直到被动方支持被提供的格式,协调成功,否则,当主动方用完所有支持的格式,协调失败。DirectShow过滤器使用一种称作内存分配器(Allocator)的COM对象管理媒体流数据。在连接2个过滤器前,其中一个过滤器上的针脚提供1个内存分配器,另外一个过滤器上的针脚对该内存分配器进行检测。当2个针脚都支持该内存分配器时,协调成功。开始传输媒体流之前,内存分配器负责创建一系列内存缓冲区。媒体流传输时,上游(Upstream)过滤器填充这些缓冲区,并将它们传送给下游(Downstream)过滤器。DirectShow使用一种称作媒体采样包(MediaSample)的COM对象管理单个缓冲区。通过控制媒体采样包对象可修改当前缓冲区中的媒体类型、时间戳等信息,也可利用算法处理媒体数据,从而实现对媒体流的处理功能。COM组件的实现包括以下内容:用接口规定过滤器组件对外提供的功能;提供类厂,用以创建COM对象的实例;提供COM对象所在dll文件的各个辅助函数,以完成COM组件在应用程序中的载入和释放、在注册表中的注册和注销。DirectShow中的过滤器、针脚等COM对象通过接口对外提供各种功能。除了提供标准的接口之外,DirectShow还提供了DECLARE_INTERFACE宏让用户自定义接口,从而满足用户对过滤器组件的指定要求。COM实现机制中用类厂创建COM对象实例。 DirectShow提供了类厂类CClassFactory和类厂模板类CFactoryTemplate。通过将不同的类厂模板的内容填入类厂,实现不同的类厂对象,从而创建不同的COM对象实例。 组件的实现 COM组件的实现包括以下内容:用接口规定过滤器组件对外提供的功能;提供类厂,用以创建COM对象的实例;提供COM对象所在dll文件的各个辅助函数,以完成COM组件在应用程序中的载入和释放、在注册表中的注册和注销。 DirectShow中的过滤器、针脚等COM对象通过接口对外提供各种功能。除了提供标准的接口之外,DirectShow还提供了DECLARE_INTERFACE宏让用户自定义接口,从而满足用户对过滤器组件的指定要求。COM实现机制中用类厂创建COM对象实例。 DirectShow提供了类厂类CClassFactory和类厂模板类CFactoryTemplate。通过将不同的类厂模板的内容填入类厂,实现不同的类厂对象,从而创建不同的COM对象实例。 过滤器是dll文件格式的COM组件,需要以下函数:DllMain(载入时的入口)、DllGetClassObject(创建类厂对象)、DllCanUnloadNow(判断是否释放dll)、DllRegisterServer(在注册表中注册dll)、DllUnregisterServer(在注册表中反注册dll)。 DirectShow已经实现了前3个函数,后面的2个函数通常调用DirectShow中的函数AmovieDllRegisterServer2(实现。) 三、网络通信模块的实现 1.网络通信过滤器的实现 本系统中网络过滤器的开发是以微软DirectX9.0SDK示例为基础实现的。 (1)网络过滤器的基本框架网络滤器的基本框架 代码如下: ClassCInputPin//定义过滤器输入引脚类由 CBaseInputPin派生 ClassCNetworkSend//定义一个由CBaseFilter基类派 生的类 ClassCNetOutputPin//定义过滤器输出引脚类由 CBaseOutputPin派生 ClassCNetworkReceiverFilter//定义一个由CBase Filter基类派生的类 (2)网络过滤器的具体实现 在网络过滤器的具体实现中,要考虑所采用的视频编解码器的媒体格式的特征。本文采用DivXNetworks公司的DivX5.02编解码器实现视频图的压缩、解压缩编码处理,并在GetMediaType函数中定义媒体格式代码。网络发送过滤器中GetMediaType函数的部分代码: CMediaType*pmt; pmt->SetType(&MEDIATYPE_Video);//设置媒体主类型 pmt->SetSubtype(&TIME_FORMAT_NONE); /设置媒体次类型为任意类型 网络接收过滤器中GetMediaType函数的部分代码: pmt->SetType(&MEDIATYPE_Video);//设置媒 体主类型 pmt->SetSubtype(&DIVX);//设置媒体次类型 为DIVX pmt->SetFormatType(&FORMAT_VideoInfo); //设置媒体格式 pmt->SetSampleSize(pvi->bmiHeader. biSizeImage);//设置媒体采样包大小 2.组播传输的实现 Windows环境下组播通信是基于WindowsSocket的。Socket(套接字)是一种基于TCP/IP的网络编程接口,采用客户/服务器通信模式,客户端和服务器端通过Socket接口在网络上实现连接和数据交换。Socket提供了一系列系统调用,使用户可以方便地使用TCP和UDP等网络协议实现通信。Winsock定义并记录了如何使用API函数与TCP/IP连接。应用程序通过调用Winsock的API函数实现相互之间的通信,Winsock又利用下层的网络通信协议和操作系统调用实现实际的通信工作。应用程序与Winsock之间的关系如图2所示。 Socket是网络编程中的一个重要的概念,由通信双方的1组IP地址和应用程序的端口号组成。通过IP地址可以唯一地确定网络上的1台主机,而通过端口号又可以唯一确定该主机上的1个应用进程,这样通过Socket就可以在网络中唯一确定通信双方的进程,进而 可以唯一确定网络中的1条通道。 WindowsSocket为IP组播的实现提供2种不同的方法:Winsock1与Winsock2。在本系统中实现了基于Winsock2的组播通信编程。IP组播实现的流程如图3所示。 结束语:实验证明,利用过滤器开发技术可以方便高效地实现视频数据的传输,很好地解决视频监控系统通用性差、可扩展性不强的问题。笔者在研究开发银行安全视频监控系统中,利用过滤器开发技术实现了远程监控系统中网络通信模块的开发,应用效果良好。
中国论文网(www.lunwen.net.cn)免费学术期刊论文发表,目录,论文查重入口,本科毕业论文怎么写,职称论文范文,论文摘要,论文文献资料,毕业论文格式,论文检测降重服务。 返回电子论文列表