论文部分内容阅读
[摘要]随着第三代监控系统的成熟,利用视频流技术的实时远程视频监控系统也应运而生。直接使用解压缩算法支持实时播放通用性和移植性差。
[关键词]DirectShow 远程监控 MPEG-4 过滤器
中图分类号:TP3 文献标识码:A 文章编号:1671-7597(2008)1220123-02
一、引言
数字视频压缩编码技术日益成熟,多媒体计算机性能不断提高,网络带宽逐步增大,以网络为依托的第三代监控系统[1]已日趋成熟。利用视频流技术实现远程实时监控的视频监控系统也应运而生。直接使用解压算法对视频流实时解压预览,做到边下边看,这种方法效率高,支持实时播放但算法复杂,缺少通用性,软件可移植性较差。DirectShow是微软公司设计的多媒体开发工具,简化多媒体应用程序的开发,使开发者不必考虑复杂的流数据格式和不同的终端设备,以及数据同步的问题。给多媒体程序开发员提供了标准的、统一的、高效的API接口,具有较好的通用性和可移植性。
二、实现原理
DirectShow是基于模块化,每个功能模块都采取COM组件方式,称Filter,在DirectShow中只要拥有相应的分析和解码Filter就可以支持任何多媒体的格式。DirectShow分别提供了Source Filters、Transform Filters
和Rendering Filters来支持多媒体数据的采集功能、格式转换传输功能以及显示存储功能这三大功能[2]。DirectShow对数据的处理实际上就是把不同功能的过滤器连接起来,依次对数据进行相应的处理,然后再传递给下一级的过滤器,其体系结构如图1所示。
Source Filters主要负责取得媒体数据,它从外部设备获取原始数据并作简单处理,再将数据往下一级过滤器送。数据源可以是文件、Internet数据流、视频采集卡等。Transform Filters主要负责数据的格式转换和传输(如编码与解码);Rendering Filters主要负责数据的最终展现,可以将数据送给声卡、显卡进行多媒体的演示,也可以输出到文件进行存储。
Filter Graph Manager负责应用程序与Filter之间的通信与交互。过滤器与过滤器的连接点称为针(pin),是一个由过滤器生成的CMO对象,支持接口IPin。针负责与其他针相连并提供传送数据的接口,针有方向性,或者输入或者输出。
三、远程视频监控系统的设计与实现[3]
整个视频监控系统有2部分组成:远程监控端和客户端。远程监控端实时采集图像,客户端通过网络实现对远程监控点的控制。整个系统的结构图如图2所示。
从图2可以看出,网络的左边为远程监控端主要负责视频数据的采集,采集以后的视频数据先进行压缩编码,然后再传到客户端;网络用来负责传输视频数据;客户端则主要负责对摄像头点的运转方向进行控制,完成视频数据的接收,解码和显示。接收数据先存储在公用缓冲区中,视频显示模块读取缓冲区中的视频数据并通过解码后显示实时的录像。
(一)视频采集模块
远程监控端能在本地预览采集的视频信息并将采集的信息通过网络发送到客户端,过滤器的连接如图3所示。在远程监控端,视频数据的采集设备使用的是WDM驱动模型的摄像头,在应用程序中,用DirectShow提供的一个专门的系统枚举组件CLSID_SystemDeviceEnum,得到采集设备的标识,并将设备标识绑定成一个过滤器就可以了。
得到采集设备过滤器后,接下来是要获得压缩过滤器。DirectShow已将PC中已有的编码器封装成编码过滤器。一台安装多个播放软件的PC机有许多编码器,每一个编码器在生成的时候都有自己唯一的GU ID,可以根据ID来创建编码过滤器。在应用程序中使用CoCreateInstance(CLSID_ffdshowcodec,
NULL,CLSCTX_INPROC_SERVER,IID_IBaseFilter,(void**)&pffdCodec),将ffdshow编码器绑定成过滤器,指针为pffdCodec。然后使用m_pGraph->AddFilter(p-ffdCodec,"ffdCodec-Filte")将该编码过滤器加入到FilterGraph中参与工作。Smart Tree过滤器有一个输入引脚和两个输出引脚,输入引脚连接上层的MPEG Video Encoder过滤器,输出引脚分别连接了Video rende过滤器和video t-ransmit过滤器,分别实现对远程监控端视频的预览和传输。这样视频采集模块即远程监控端的过滤器结构就搭建好了。
(二)视频传输模块
考虑到网络数据量的问题,视频传输采用单向传输,即远程终端向处理终端传输,由远程端接收现场的采集图像数据。基于IP网络的视频发送模块和接收模块在DirectShow中没有现成可用的Filter,因此需要自己设计和开发。视频发送模块(Video Sender Filter)主要接收视频采集模块的视频数据,并通过网络发送出去。Video Sender Filter的实现主要是通过CbaseFilter( )基类和 Cpin( )基类继承实现的,其输入引脚的媒体类型需要自己定义,其定义如下:
CInputPin:: GetMediaType (IN int iPos,OUT CMediaType*p)
{
ASSERT(mt) :
if (iPos = = 0)
{
p - > InitMediaType ():
p ->SetType (&MEDIA_TYPE_VIDEO) :
p -> SetSubtype ( &TIME_FORMAT_NONE):
return p_OK :
}
return VFW_S_NO_MORE_ ITEMS :
}
其中SetType函数决定引脚输入的是视频数据,SetSubtype函数决定视频数据的辅助类型,TIME_FORMAT_NONE表示任何编码方式的视频数据均可通过,当然也包括系统中MPEG4格式的编码数据[5,6]。通过重载接口的Receive( )方法来获取视频数据,再通过内部建立的网络连接将视频数据发送到网络的另一端;视频接收模块(Video ReceiverFilter)主要接收由网络发送来的视频数据,并将接收到的视频数据传递给下层Filter(如视频显示模块)。Video ReceiverFilter的实现也是通过重载CbaseFilter( )和CbaseOutputPin( )接口,在接收到网络视频数据时通过调用接口的Deliver
( )方法将视频数据“PUSH”向下层Filter。
(三)视频数据显示模块
基于DirectShow的视频接收端软件系统流程图如4,由Source Filter,Mpeg Video Decoder和Video Renderer顺序连接构成过滤器图。其中Source Filter负责从IP网络中接收数据包,然后将接收到的数据送到下一个过滤器Mpeg Video Decoder进行解压,最后解压后的视频数据流Video Renderer送给显卡。
客户端中接收网络中的视频数据是通过NetReceiver( )过滤器来完成。NetReceiver( )接收到网络中来的视频数据,然后传递给客户端PC机中的解码器。同样地,DirectShow将它包装成解码过滤器。解码过滤器要与编码过滤器对应,来解码MPEG4格式的视频数据。需要对接收过滤器的输出引脚的媒体类型进行设置即使输出引脚的媒体类型和解码过滤器的媒体类型一致,否则收过滤器的输出引脚与解码过滤器的输入引脚能够不能连接,设置在输出引脚的GetMediaType( )中进行设置。
四、系统测试和结束语
在局域网环境下,利用奔四2.4G计算机对本系统测试。测试结果表明,该系统丢包率为1.3%,网络延时1.0秒左右。系统具有较为流畅的传输性能,实时传输时画面抖动不是很明显,能够较好完成视频监控的目的。但是系统的功能还有待加强完善,带宽的占用率也要进一步的降低。
参考文献:
[1]王晓玲、王猛,基于Web的视频监控系统设计[J].计算机工程与应用,2004(7):221223.
[2]王海彬、范春年,基于directshow技术的视频监控系统的设计与实现[J].中国科技信息,2008(2):106-107.
[3]陆其明,DirectShow实务精选[M].北京:科学出版社,2004.
[4]周慧,杨杰.基于DirectShow框架的视频监控系统[J].武汉理工大学学报:信息与管理工程版,2007.29(5):40-42.
作者简介:
黄晶晓,男,硕士研究生,主要研究方向:计算机网络与信息系统。
[关键词]DirectShow 远程监控 MPEG-4 过滤器
中图分类号:TP3 文献标识码:A 文章编号:1671-7597(2008)1220123-02
一、引言
数字视频压缩编码技术日益成熟,多媒体计算机性能不断提高,网络带宽逐步增大,以网络为依托的第三代监控系统[1]已日趋成熟。利用视频流技术实现远程实时监控的视频监控系统也应运而生。直接使用解压算法对视频流实时解压预览,做到边下边看,这种方法效率高,支持实时播放但算法复杂,缺少通用性,软件可移植性较差。DirectShow是微软公司设计的多媒体开发工具,简化多媒体应用程序的开发,使开发者不必考虑复杂的流数据格式和不同的终端设备,以及数据同步的问题。给多媒体程序开发员提供了标准的、统一的、高效的API接口,具有较好的通用性和可移植性。
二、实现原理
DirectShow是基于模块化,每个功能模块都采取COM组件方式,称Filter,在DirectShow中只要拥有相应的分析和解码Filter就可以支持任何多媒体的格式。DirectShow分别提供了Source Filters、Transform Filters
和Rendering Filters来支持多媒体数据的采集功能、格式转换传输功能以及显示存储功能这三大功能[2]。DirectShow对数据的处理实际上就是把不同功能的过滤器连接起来,依次对数据进行相应的处理,然后再传递给下一级的过滤器,其体系结构如图1所示。
Source Filters主要负责取得媒体数据,它从外部设备获取原始数据并作简单处理,再将数据往下一级过滤器送。数据源可以是文件、Internet数据流、视频采集卡等。Transform Filters主要负责数据的格式转换和传输(如编码与解码);Rendering Filters主要负责数据的最终展现,可以将数据送给声卡、显卡进行多媒体的演示,也可以输出到文件进行存储。
Filter Graph Manager负责应用程序与Filter之间的通信与交互。过滤器与过滤器的连接点称为针(pin),是一个由过滤器生成的CMO对象,支持接口IPin。针负责与其他针相连并提供传送数据的接口,针有方向性,或者输入或者输出。
三、远程视频监控系统的设计与实现[3]
整个视频监控系统有2部分组成:远程监控端和客户端。远程监控端实时采集图像,客户端通过网络实现对远程监控点的控制。整个系统的结构图如图2所示。
从图2可以看出,网络的左边为远程监控端主要负责视频数据的采集,采集以后的视频数据先进行压缩编码,然后再传到客户端;网络用来负责传输视频数据;客户端则主要负责对摄像头点的运转方向进行控制,完成视频数据的接收,解码和显示。接收数据先存储在公用缓冲区中,视频显示模块读取缓冲区中的视频数据并通过解码后显示实时的录像。
(一)视频采集模块
远程监控端能在本地预览采集的视频信息并将采集的信息通过网络发送到客户端,过滤器的连接如图3所示。在远程监控端,视频数据的采集设备使用的是WDM驱动模型的摄像头,在应用程序中,用DirectShow提供的一个专门的系统枚举组件CLSID_SystemDeviceEnum,得到采集设备的标识,并将设备标识绑定成一个过滤器就可以了。
得到采集设备过滤器后,接下来是要获得压缩过滤器。DirectShow已将PC中已有的编码器封装成编码过滤器。一台安装多个播放软件的PC机有许多编码器,每一个编码器在生成的时候都有自己唯一的GU ID,可以根据ID来创建编码过滤器。在应用程序中使用CoCreateInstance(CLSID_ffdshowcodec,
NULL,CLSCTX_INPROC_SERVER,IID_IBaseFilter,(void**)&pffdCodec),将ffdshow编码器绑定成过滤器,指针为pffdCodec。然后使用m_pGraph->AddFilter(p-ffdCodec,"ffdCodec-Filte")将该编码过滤器加入到FilterGraph中参与工作。Smart Tree过滤器有一个输入引脚和两个输出引脚,输入引脚连接上层的MPEG Video Encoder过滤器,输出引脚分别连接了Video rende过滤器和video t-ransmit过滤器,分别实现对远程监控端视频的预览和传输。这样视频采集模块即远程监控端的过滤器结构就搭建好了。
(二)视频传输模块
考虑到网络数据量的问题,视频传输采用单向传输,即远程终端向处理终端传输,由远程端接收现场的采集图像数据。基于IP网络的视频发送模块和接收模块在DirectShow中没有现成可用的Filter,因此需要自己设计和开发。视频发送模块(Video Sender Filter)主要接收视频采集模块的视频数据,并通过网络发送出去。Video Sender Filter的实现主要是通过CbaseFilter( )基类和 Cpin( )基类继承实现的,其输入引脚的媒体类型需要自己定义,其定义如下:
CInputPin:: GetMediaType (IN int iPos,OUT CMediaType*p)
{
ASSERT(mt) :
if (iPos = = 0)
{
p - > InitMediaType ():
p ->SetType (&MEDIA_TYPE_VIDEO) :
p -> SetSubtype ( &TIME_FORMAT_NONE):
return p_OK :
}
return VFW_S_NO_MORE_ ITEMS :
}
其中SetType函数决定引脚输入的是视频数据,SetSubtype函数决定视频数据的辅助类型,TIME_FORMAT_NONE表示任何编码方式的视频数据均可通过,当然也包括系统中MPEG4格式的编码数据[5,6]。通过重载接口的Receive( )方法来获取视频数据,再通过内部建立的网络连接将视频数据发送到网络的另一端;视频接收模块(Video ReceiverFilter)主要接收由网络发送来的视频数据,并将接收到的视频数据传递给下层Filter(如视频显示模块)。Video ReceiverFilter的实现也是通过重载CbaseFilter( )和CbaseOutputPin( )接口,在接收到网络视频数据时通过调用接口的Deliver
( )方法将视频数据“PUSH”向下层Filter。
(三)视频数据显示模块
基于DirectShow的视频接收端软件系统流程图如4,由Source Filter,Mpeg Video Decoder和Video Renderer顺序连接构成过滤器图。其中Source Filter负责从IP网络中接收数据包,然后将接收到的数据送到下一个过滤器Mpeg Video Decoder进行解压,最后解压后的视频数据流Video Renderer送给显卡。
客户端中接收网络中的视频数据是通过NetReceiver( )过滤器来完成。NetReceiver( )接收到网络中来的视频数据,然后传递给客户端PC机中的解码器。同样地,DirectShow将它包装成解码过滤器。解码过滤器要与编码过滤器对应,来解码MPEG4格式的视频数据。需要对接收过滤器的输出引脚的媒体类型进行设置即使输出引脚的媒体类型和解码过滤器的媒体类型一致,否则收过滤器的输出引脚与解码过滤器的输入引脚能够不能连接,设置在输出引脚的GetMediaType( )中进行设置。
四、系统测试和结束语
在局域网环境下,利用奔四2.4G计算机对本系统测试。测试结果表明,该系统丢包率为1.3%,网络延时1.0秒左右。系统具有较为流畅的传输性能,实时传输时画面抖动不是很明显,能够较好完成视频监控的目的。但是系统的功能还有待加强完善,带宽的占用率也要进一步的降低。
参考文献:
[1]王晓玲、王猛,基于Web的视频监控系统设计[J].计算机工程与应用,2004(7):221223.
[2]王海彬、范春年,基于directshow技术的视频监控系统的设计与实现[J].中国科技信息,2008(2):106-107.
[3]陆其明,DirectShow实务精选[M].北京:科学出版社,2004.
[4]周慧,杨杰.基于DirectShow框架的视频监控系统[J].武汉理工大学学报:信息与管理工程版,2007.29(5):40-42.
作者简介:
黄晶晓,男,硕士研究生,主要研究方向:计算机网络与信息系统。