2.2流媒体与DirectShow视频技术数字视频压缩简介[2,3,29-42]:数字视频的压缩编码技术是Internet视频传输中的最为关键技术之一,视频流传输中最为重要的编/解码标准有国际电联的H.26x系列,运动静止图像专家组的M-JPEG和国际标准化组织运动图像专家组的MPEG系列标准,此外还有应用广泛的Real-Networks的RealVideo、微软的WMT以及Apple公司的QuickTime等等。M-JPEG(MotionJPEG),是利用JPEG标准定义图像压缩,从而可以生成序列化运动图像,是全动的JPEG影像,因此M-JPEG实际上是静止画片与活动图像之间的中间格式。M-JPEG是基于JPEG的一种编码算法,是对帧内的空间冗余进行压缩,通常可达6:1的压缩率。MPEG(MovingPictureExportsGroup)运动图像专家组1993年8月提出“用于数字存储媒体运动图像及其伴音率为1.5Mb/s的压缩编码”,即MPEG-1,该标准的平均压缩比为50:1,处理能力可达到360*240像素。MPEG工作组于1994年推出针对标准数字电视和高清晰度电视在各种应用下的压缩方案和系统层的详细规定,MPEG-2压缩标准。其处理能力可达到720*480像素,兼容MPEG-1标准,适应1.5~80Mb/s的编码范围。MPEG-2特别适用于广播级的数字电视的编码和传送、被认定为高清晰度电视HDTV全数字方案、DVD方案所采用的数据压缩标准。MPEG工作组于1999年2月正式公布MPEG-4标准第一版本。MPEG-4不只是具体压缩算法,它是针对数字电视、交互式绘图应用、交互式多媒体等整合及压缩技术的需求而制定的国际标准。MPEG-4是一种高效率的编码标准,其应用范围最宽到数字电视,最低可到移动多媒体和电子游戏,编码比特率相应可分为384Kb/s~1Mb/s,64~384Kb/s和64Kb/s以下。MPEG-4标准同以前标准的最显著差别是它采用基于对象的编码理念,使用户可在接收端对画面进行操作和交互访问的编码标准。H.264标准是ITU-T的VCEG(视频编码专家组)和ISO/IEC的MPEG(活动图像专家组)的联合视频组(JVT,JointVideoTeam)开发的标。2003年5月H.264/AVC(AdvancedVideoCoding)标准正式推出,该标准正式名称为H.264/MPEG-4part10AVC。H.264标准的主要目标是力求设计简单有效的编码技术,并具有高效的压缩性能和易于网络传输的能力,以满足日益增长的“对话型”(视频电视、会议等)、“非对话型”(视频存储、广播以及流媒体等)以及数码影院、视频监控等视频应用的需求。与MPEG-4标准相比,其编码性能有了较大突破,在30-35dB的解码质量范围内,能比MPEG-4节约30%~50%的码率[30]。2.2.1流媒体技术流媒体技术是一种实现在因特网上实时顺序地传输和播放音/视频等多媒体数据的网络传输技术[35-36],其支持多媒体数据的实时下载和回放。流媒体技术包括流媒体数据采集、音/视频编解码、存储、传输和播放等方面。一般来说,广义上的流是指使音频和视频形成稳定和连续的传输流和回放流的一系列技术、方法和协议的总称,称之为流媒体系统;狭义上的流是指相对于传统的下载——回放方式而言的一种媒体格式,用户可通过Internet边接收边播放音/视频,延时大大减少了。与下载方式相比,流式传输具有显著优点:一方面缩短了启动延时,同时也降低了对缓存容量的需求;另一方面,又可以实现现场直播形式的实时数据传输,有助于保护多媒体数据的著作权。1.缓存技术[3]实时音/视频源或存储的音/视频文件在传输中被分解主许多包,因网络是动态变化的,各个包选择的路由可能不相同,到达客户端的时间也就不等,甚至先发的数据比后发的落后。可以使用缓存技术来弥补延迟和抖动的影响,并保证数据包的顺序正确,使媒体数据能连续输出,不会因网络暂时拥塞令播放出现停顿的现象。2.流媒体技术原理[3]流媒体传输的一般流程是:Web浏览器与Web服务器之间使用HTTP/TCP交换控制信息,把需要传输的实时数据从原始信息中检索出来;用HTTP从Web服务器检索相关数据,音/视频播放器进行初始化;从Web服务器检索出来的相关服务器的地址定位音/视频服务器;音/视频播放器与音/视频服务器之间交换音/视频传输所需要的实时控制协议;一旦音/视频数据抵达客户端,音/视频播放器即码上解码播放。目前视频流传输常用的视频编码方法主要有以下4种[30]:1.自适应编码:需要在发送端和接收端之间建立一个反馈信道,接收端将网络的当前状况(如丢包率、传输时延等)反馈给发送发,发送方根据这些信道信息估计出发送速率后,调整视频编码器的编码参数,生成适当的视频码流。不过此方法开销大,对服务器要求高。2.转码:基本思想是把以某种格式或标准压缩的码流直接转换到另一种格式或标准的压缩数据,目标是在传输环境和处理能力受限情况下,在码流转换的质量和复杂性之间取得最佳折衷。3.码流切换:基本思想是在视频服务器中存储同一视频的多个不同码率的码流,随着网络带宽的动态变化,视频服务器可以在几个视频码流之间切换,以达到动态适应网络状况变化目的。其需要输大容量磁盘存储空间。4.可扩展编码:基本思想是把视频编码成一个基本层以及一个或多个增强层,其优点是能根据网络和终端的状况,通过是否传输增强层来提供不同等级的重建视频,但同时增加了终端的处理负担。本文应用的压缩视频流是MPEG-1、MPEG-4格式,因两者图像压缩编码效率高,图像质量满足安防行业的常用要求。MPEG-1标准的视频数据传输速率为1.5Mb/s,MPEG-4标准则可适用于200Kb/s至800Kb/s的较低带宽环境,因而MPEG-4标谁面世即获得大众的青睐。2.2.2COM组件技术COM的英文全称是ComponentObjectModel,也就是组件对象模型[43-44]。COM的发布形式是以win32动态链接库(DLL)或者可执行文件(EXE)的形式发布的可执行代码组成。COM组件是动态连接的,是完全与语言无关的。同时,COM组件可以以二进制的形式发布。COM组件还可以在不妨碍老客户的情况下被升级成新的版本。COM的基础包括三样:接口、对象和类厂[46]。在COM编程中,接口包括一系列相关的方法,对象实现一系列接口,而类厂是一个特殊的COM对象,它创建或实例化其余的COM对象。接口、对象和类厂的图例符号如下表示:图2-7接口、对象和类厂图例Fig.2-7Interface,ObjectandClassFactoryOutlineCOM本身只是一种规范,而不是实现[43,46]。如果使用C++来实现时,COM组件就是一个C++类,而接口都是纯虚类。按照约定俗成,接口都会带一个大写的前缀I,每一个接口都由一个128位的全局唯一标志符(GUID)来标识。可以用如下C++代码来简单描述一个COM组件[46]。图2-8C++代码表示COM组件Fig.2-8C++CodesforCOMComponent其中,Ifunction就是常说的接口,而MyObject就是COM组件对象。图2-9MyObject组件对象示意图Fig.2-9MyObjectComponentObjectOutlineCOM规范要求所有兼容COM的接口必须由IUnknown派生出来。IUnknown定义了3个重要方法,分别是:图2-10接口IUnknow的3个函数Fig.2-10ThreeFunctionsforInterfaceofIUnknow其中,QeryInterface负责组件对象上的接口查询,以获取该对象上提供的其余服务;AddRef用于增加引用计数,Release用于减少引用计数。每当COM组件对象被引用一次就应调用一次方法AddRef,而当释放COM组件对象的某一接口时就应调用相应的Release方法。引用计数是COM中的一个非常重要的概念,它很好地解决了组件对象什么时候被销毁,以及由谁来销毁的生命周期问题。除了IUnknown接口外,还有一个重要的接口:IClassFactory。COM规范规定,每个组件都必须实现一个与之相对应的类厂(ClassFactory)。类厂也是一个COM组件,它实现了IClassFactory。图2-11类厂与COM组件对象的关系图Fig.2-11RelationbetweenClassFactoryandCOMObjectCOM组件有2种基本类型:进程内服务器组件、进程外服务器组件[9]。本论文主要采用进程内服务器组件类型进行开发,因而后面谈及的是以进程内服务器组件为为基础的。在COM库中,有三个API函数可用来创建对象:CoGetClassObject、CoCreateInstance、CoCreateInstanceEx。进程内服务器组件对象的创建流程大概如下:COM客户程序调用CoGetClassObject,而CoGetClassObject调用DLL模块的DllGetClassObject引出函数,将参数clsid、iid、ppv传给DllGetClassObject函数,并返回类厂对象的接口指针。然后调用类工厂的接口方法IClassFactory::CreateInstance即可真正创建CLSID_Object标识的组件对象。图2-13COM对象创建过程示意图Fig.2-13CreationProcessingofCOMObject对于CoCreateInstance来说,它其实是一个封装了类厂对象创建过程的辅助函数,其内部实际调用了CoGetClassObject函数。客户程序只需指明对象类的CLSID、接口IID和输出的接口指针,不需与类厂打交道即可创建COM组件对象。对于CoCreateInstanceEx来说,其主要用于创建进程外服务器组件对象。2.2.3DirectShow视频技术DirectX软件开发包是微软公司提供的一套在Windows操作平台上开发高性能图形、声音、输入、输出和网络游戏的编程接口[45-46]。因DirectX采用了组件对象模型(COM)标准技术,故使用DirectXSDK开发多媒体应用程序前,应对COM组件技术有基本的理解。DirectShow作为DirectX大家族的一员,为Windows平台上处理各种格式的媒体文件的回放、音视频采集等高性能要求的多媒体应用,提供了完整的解决方案。Filter是DirectShow中最基本的概念[46]。DirectShow使用FilterGraph来管理Filter,FilterGraph是Filter的容器,而Filter是FilterGraph中的最小功能模块。Filter一般由一个或多个Pin组成,Filter之间通过Pin相互连接,构成一条顺序的链路。仅含有输出Pin,没有输入Pin的Filter为SourceFilter;既有输入Pin也有输出Pin的Filter为TransformFilter;只有输入Pin,没有输出Pin的Filter为RenderingFilter。3种Filter在GraphEdit下显示如下图:图2-153种Filter类型Fig.2-15ThreeTypesFilterFilter是一种COM组件,实现Filter的文件一般是一个DLL,使用前必须先注册。Filter的创建与普通的COM组件一样,通过API函数CoCreateInstance()来完成。DirectShow系统概述[45-47]:DirectShow系统位于应用层中,它使用一种叫FilterGraph过滤图的模型来管理整个数据流的处理过程;参与数据处理的各个功能模块叫做Filter过滤器;各个Filter在FilterGraph中按一定的顺序连接成一条“流水线”协同工作。图2-14DirectShow系统(源自DirectXSDK9.0)Fig.2-14DirectShowSystem(F