《750.基于DirectShow的视频监控系统设计分析.doc》由会员分享,可在线阅读,更多相关《750.基于DirectShow的视频监控系统设计分析.doc(58页珍藏版)》请在三一办公上搜索。
1、 农业工程学院毕 业 设 计基于DirectShow的视频监控系统设计分析姓 名 院(系) 信息学院专业班级 信息管理与信息系统042班学 号 指导教师 职 称 (硕士)论文答辩日期 2004年4月19日 农业工程学院教务处制学生承诺书本人承诺所呈交的毕业论文是严格按照学校和学院有关规定完成的;论文的内容都是自己的劳动成果,没有请人代笔;本人在毕业论文中引用他人的观点和参考资料均加以注释和说明。 承诺人: 摘要近年来,随着计算机网络,多媒体技术的快速发展,传统的视频监控系统正在向着网络视频监控系统的方向发展。本文阐述了基于DirectShow视频监控系统的分析、设计与实现,重点讨论了以Dire
2、ctShow技术来实现的,在C/S(Client/Server)模式下实时传输并播放视频的局域网视频监控系统。本文从以下方面进行论述:(1)简单介绍了视频监控技术发展的概况与目前的形势。 (2)就系统的开发环境和涉及的关键技术进行了探讨并提出了解决方案。(3)详细阐述了系统的设计与实现。首先阐述了基于C/S模式的服务端、客户端的设计构架;通过讲述COM组件技术作为应用DirectShow视频技术开发应用程序的基础,最后引出DirectShow视频技术的工作原理和编程实现。关键词:COM组件DirectShow多线程技术TCP/UDP协议目录1绪论11.1视频监控系统的国内外现状11.2本论文的
3、研究背景与实际意义11.3视频监控的发展历程21.4视频监控系统的应用41.5论文主要研究内容52开发环境简介52.1开发平台及工具的选择52.2面向对象的编程思想62.3多线程技术73开发实现系统的技术73.1WinSock编程机制73.1.1基于TCP协议的WinSock编程83.1.2基于UDP协议的WinSock编程103.2COM成组件技术与DirectShow视频技术113.2.1COM组件技术113.2.2DirectShow视频技术144系统构成与功能模块设计174.1系统架构与功能设计174.1.1服务端架构与功能设计184.1.2客户端架构与功能设计194.2网络传输架构1
4、94.3系统通信模块设计原理204.3.1 控制信道设计原理204.3.2数据信道设计原理215系统终端软件设计与实现225.1系统的类层次结构225.2系统的实现原理265.3服务端软件的设计与实现285.3.1基于DirectShow视频采集模块设计与实现285.3.2角色控制的实现325.3.3服务端与客户端之间通讯模块的实现335.3.4开发网络发送Filter355.3.5开发网络接收Filter365.4客户端软件的设计与实现366系统实验测试与总结386.1系统实验测试386.2总结与展望457结束语46参考文献47英文摘要48致谢49仲恺农业工程学院毕业设计成绩评定表50图 目
5、 录图1DVR系统结构图3图2应用程序和WinSock的关系图8图3TCP客户端与TCP服务端进行连接的步骤9图4数据报套接字应用程序时序图11图5接口、对象和类厂的图例11图6C+代码表示COM组件12图7MyObject组件对象示意图12图8接口IUnknow的3个函数13图9类厂与COM组件对象的关系13图10COM对象创建过程示意图14图113种Filter类型15图12DirectShow系统(源自DirectX SDK9.0)16图13开发DirectShow应用程序过程(源自DirectX SDK9.0)17图14系统总体架构17图15系统服务端软件结构18图16服务端功能模块1
6、9图17客户端功能模块19图18控制信道设计原理21图19数据信道设计原理21图20系统的类层次结构23图21系统的类继承结构24图22构建发送和接收视频数据的FilterGraph26图23AVMontitor程序的交互流程27图24视频采集卡在GraphEdit下的示意图28图25视频采集模块软件流程图29图26设备枚举流程图(源自DirectX SDK帮助文档29图27视频采集预览的数据流向图31图28视频采集预览图32图28服务端通信模块结构图34图29选择作为客户端的情况37图30向服务端发出连接请38图31服务端选择角色窗口39图32服务端预览视频窗口40图33服务端等待接收来自客
7、户端的视频数据41图34服务端接收并实时播放视频数据42图35客户端选择角色窗口43图36客户端预览视频窗口43图37客户端向服务端发出连接请求44图38客户端等待接收来自服务端的视频数据44图39客户端接收并实时播放来自服务端的视频数据451绪论1.1视频监控系统的国内外现状 由于历史及观念上的原因,我国大陆的安防产业较发达国家晚二三十年。但是近年来,随着我国经济的快速发展、人民物质生活水平的提高和消费观念的改变,安防从过去提倡人防发展为以技防为主、人防为辅,并成为现代管理的重要手段。在2000年11月的安防产品展示会上,来自国内外的上百家厂商展出了各种产品和系统。据权威部门统计,1998年
8、全国监控系统的市场总额为650亿元,近年来一直以每年15%至30%的速度快速增长,我国的监控行业正面临着良好的发展机遇。 监控系统的市场可以划分为两部分:一部分是前端采集用的通用产品,有镜头、CCD摄像机、云台及防护罩、报警开关等;另一部分是后端的控制系统,主要包括主机控制设备、视频采集卡、视频压缩卡、解码器、总控设备等。前端的产品大部分都是通用产品,以美国、日本和台湾产品居多,占据了市场的大部分份额。相对而言,后端的控制系统是互相封闭的,各厂家之间的设备和系统不能互联,也没有通用的工业标准,这部分市场正是视频监控系统要开拓的主要目标。视频监控系统不仅符合信息产业的未来发展趋势,而且代表了监控
9、行业的未来发展方向,蕴藏着巨大的商机和经济效益,成为目前信息产业中颇受关注的数字化产品。特别是近年来,随着技术的进步和社会经济的不断发展,客观上对监控系统的准确性、有效性和方便性提出了更高要求。具体地讲,主要体现在以下两个方面:一是需要实施视频监控的范围更加广阔,由传统的安防监控向管理监控和生产经营监控发展,而且对同一套系统的覆盖面和实施距离也提出了更高的要求,通俗地说就是要达到点多面广。二是要求监控系统与管理信息系统、网络系统结合,实现对大量视频数据的压缩存储、传输和自动处理,从而达到资源共享,为各级管理人员和决策者提供方便、快捷、有效的服务。由于视频监控产品潜在的巨大市场和可观经济效益,我
10、国有数百家公司以及部分科研机构参与了该行业的开发和销售。但总的来讲,由于起步晚,技术较落后,使该行业中的我国企业既有广阔的发展空间,又面临着来自国外大企业的强大挑战。就目前先进的数字视频监控系统而言,在视频压缩、分析、传输、存储和分级控制等方面仍有待提高和完善1。1.2本论文的研究背景与实际意义伴随电子集成技术、计算机技术、通信网络技术及图像视频压缩技术的迅速发展和相互结合应用,数字化、网络化的视频监控系统已逐渐成为了市场的主流。网络视频监控系统是在成熟的数字视频监控技术基础上,结合实际可行的网络通信方式,满足本地及异地远程视频监控的需求。然而网络视频监控系统的成本较高,现大多在高端市场里应用
11、,对于中小企业及个人来说,购建网络视频监控系统是一种高额负担。为满足中小企业及个人对网络视频监控的需求,可考虑开发一种软件化的基于Windows平台的通用型的网络视频监控系统。本论文出于研究探讨的目的,开发实现Windows平台下通用型的C/S模式局域网视频监控系统,在局域网内可实现点对点的视频监控。该系统可实现对视频的实时接收和播放,为未来实现局域网中的多人视频监控和远程网络视频监控打下了技术基础,具有实用推广的价值。1.3视频监控的发展历程视频监控系统因其直观、信息内容丰富、操作控制简单方便等优点而广泛应用于众多领域2,比如交通治安、教育、医院、公共场所、物业管理、酒店等等。现今互联网的迅
12、猛发展,网络带宽的不断提高,通信技术的长足进步,使视频监控系统通过不同网络进行实时视频信息的有效地交互成为可能。视频监控虽是三十年左右发展历史的行业技术,但与移动通信技术一样正经历着第三代应用发展阶段。当前视频监控技术获得良好发展的机遇,不少科研院校和企业正对无线通信视频监控技术的进行应用研究开发工作并取得不错效果3,相信随着IPv6技术的应用发展,真正的普及化的全数字化视频监控不再是期待。(1)第一代视频监控系统- CCTV系统90年代以前,传统的本地闭路电视监控系统(CCTV: Closed Circuit TV)称为第一代视频监控系统,主要由模拟设备如摄像机、监视器、录像机等组成。CCT
13、V系统的工作原理是:前端图像采集部分的模拟摄像机将视频模拟信号通过同轴电缆直接传给系统中心部分的监视器,并使用录像机进行长时间的磁带录制。CCTV系统的主要缺点是: 视频模拟信号在同轴电缆传输时受其传输距离限制影响,组网不灵活不方便;需进行联网和远程传输时,可以采用光端机加光纤进行点对点传输,但成本可观。采用磁带方式进行录制图像必然损耗大量的磁带,查询读取过程十分烦琐。扩展功能差,对已建好的系统进行添加采集点或者新设备时,往往需要整体修改方案。 (2)第二代视频监控系统-数字化本地DVR系统 CCTV系统技术现今已经非常成熟,应用非常广泛,第二代视频监控系统是CCTV系统原有基础技术与计算机技
14、术相结合的产物。90年代中期,计算机处理能力的提高和视频压缩技术的发展,人们利用计算机高速的数据处理能力进行视频采集和处理,利用显示器的高分辨率实现图像的多画面显示,从而大大提高了图像质量,这种基于PC的多媒体主控台系统称为第二代数字化本地视频监控系统。因系统是视频信号模拟输入与数字压缩、显示和控制相结合,核心设备是数字设备,故第二代视频监控系统属于数字视频监控系统范畴。图1DVR系统结构图目前中低端的数字视频监控系统主要由DVR( Digital Video Recorder )构成,系统结构主要是工控机+视频采集卡+系统软件+应用软件。其优点突出4:采用视频数字压缩技术,将采集到的视频模拟
15、信号经数字化后存储在硬盘、光盘等存储媒介上,存储方便,省去经常更换磁带的麻烦。因对视频图像进行了数字化,所以可充分利用计算机的快速数据处理能力,对其进行压缩、分析、存储和显示。通过视频分析,可及时发现异常情况并进行联动报警,从而实现无人值守。CCTV系统中,当出现问题时需要花大量时间观看录像带才能找到现场记录;而在数字视频监控系统中,利用计算机建立的索引,数分钟内就能找到相应的现场记录,大大提高工作效率。(3)第三代视频监控系统-网络视频监控系统( NVS )99年以来,接入网技术的迅速发展,促使视频监控有了网络远程监控的新需求。而随着电子集成技术及嵌入式计算机技术水平的不断提高,出现了数字网
16、络摄像机、网络视频服务等数字化采集前端,真正的数字化从此实。第三代视频监控系统网络视频监控系统NVS( Network Video System )进入人们的视线。网络视频监控系统以网络为依托,以数字视频的压缩、存储、传输以及播放为核心,以智能实用的图像分析为特色,引发了视频监控行业的技术革命。网络视频监控系统与其它视频监控系统比较具有以下特点:最简单的整个系统可由服务端、客户端两部份组成。服务端由网络视频服务端+摄像机,或是网络摄像机等组成,只要确保好服务端和客户端之间的通讯,系统便能迅速投入工作。布控区域广阔。服务端的网络视频服务端或网络摄像机直接连入网络,没有线缆长度和信号衰减的限制。因
17、网络解决了地域的限制,故而扩展了布控区域。性能稳定可靠,无需专人管理。服务端的网络视频服务端或网络摄像机采用嵌入式实时多任务操作系统,可直接接入局域网或广域网,遇到问题只需更换即可,免去维护DVR烦琐,也非常适用于无人值守的环境。扩充简便。当需要添加监控点时,只需增加电源和网络接口的点数就能轻易实现原有视频监控系统的扩展,不需重新施工布线。1.4视频监控系统的应用 近年来,视频监控在各行各业得到了广泛的应用,生活中有小区安全监控,电讯行业有机站监控,银行系统有柜员机监控,林业部门有火情监控,交通方面有违章和流量监控等等。从功能上讲,视频监控可用于安全防范、信息获取和指挥调度等方面。 随着我国信
18、息化进程的推进和人民物质生活水平的提高,传统铁栅栏式的安全防盗系统的缺陷越来越明显,既不美观,在发生事故时也不便于有效处理。目前在建造智能大厦和选购住房时,安全防范系统越来越受到人们的重视。现在,只需在现有的家庭微机上增加USB摄像头和相应的软件系统,就可实现功能强、价格低、性能可靠的数字化家庭监控系统。系统自动检测在家中采集到的图像,当发现异常时,通过Internet和短消息中心向用户指定的电话号码发送短消息,并将现场图像以E-mail方式发送给用户。用户收到短消息后通过检查E-mail就可对家中情况有清楚的了解。此外,用户出差在外时,也可以远程登录到家中计算机,观看家中安全情况或家人的生活
19、健康状况。 我国有上万公里的海岸线和边境线,与多个国家毗邻。准确及时地掌握边防区域的军事情况,对于有效保卫祖国的领海和领土,在未来战争中作出快速反应、掌握战争主动权有着极其重要的意义。建立边防远程视频监控系统,对关键口岸、哨所和敏感地区实施监控,就能使我军情报部门直观、及时地监视边防前线的当面情况,提高情报获取的实时性和综合处理能力,也能有效防止偷渡、出逃、走私、贩毒等非法行为。 毋庸置疑,在2008年的北京奥运会中,数字视频监控系统也将大放异彩,它将广泛用于智能化的交通调度、现代化的体育场馆和优雅舒适的奥运村,为参加奥运会的各国朋友在北京的比赛、游览提供安全舒适的服务。1.5论文主要研究内容
20、本文的研究开发思路是:纵观Windows平台下的通用型C/S模式的局域网视频监控系统实现的关键点以及实际的实验条件情况,将上述系统的开发实现重点放在服务端与客户端之间的实时视频通信模块上。要开发实现软件化的Windows平台下的通用型的C/S模式局域网视频监控系统需熟悉了解和掌握的基础理论及开发应用技术比较多,就系统的核心模块须掌握的综合应用技术有:COM组件技术、DirectShow视频技术、TCP/UDP网络协议,Socket编程,多线程技术等等。本文对该系统核心部分的实际开发过程是:(1)查阅视频监控技术的发展历程的资料。(2)结合视频监控实际应用的需求进行可行性分析,研究学习COM组件
21、技术。(3)结合视频传输的特点,研究TCP/UDP这两种网络协议,实现服务端与客户端以UDP为基础的控制信息交互,以及视频数据的TCP传接。(4)深入研究微软的DirectShow视频技术,以Socket编程,多线程技术来实现服务端与客户端之间的视频的实时接收和播放。2开发环境简介2.1开发平台及工具的选择 对于整个局域网视频监控系统来说,软件设计的工作是主要的。它要完成的功能多而复杂。面对如此庞大的一个软件工程,采用正确而又有效的软件设计方法,对整个软件结构进行规划是系统成功实现的关键。 对于监控系统软件的开发来说选择一种友好的图形用户界面,且操作简单,稳定、可靠,安全性较高的操作系统是很重
22、要的。Windows2000操作系统具有好的图形用户界面,操作简单易用,可利用的资源也极其丰富,这些优势决定了如果选择Windows2000的操作系统将会为监控系统软件的开发提供一个相对坚实、稳定的平台。软件开发工具选择的原则是:能为我们提供一个健壮、高速、高效、兼容性好的开发环境。考虑到开发的效率和通用性等因素,经过仔细衡量考虑,我们选择了Visual C+ 6.0作为系统的开发工具。首先C+语言比其他语言功能更丰富,应用也更广泛。其次Visual C+使用很灵活,实现的功能也更强大,利用它可以最方便的调用Windows底层功能。最后,Visual C+是真正面向对象的开发工具,且具有强大的
23、MFC类库5。2.2面向对象的编程思想 目前Windows 2000应用程序的设计大多采用面向对象的设计方法。面向对象技术的优点是:符合人类的思维习惯,能自然表现现实世界的实体和问题;易于开发复杂软件,提高生产效率;易于实现代码的重用和维护:容易与他人共享代码;可以进一步细化己有代码。 面向对象技术6涉及的概念有以下几个: (1)对象。对象是一个由属性和方法组成的集合体。属性反映对象的状态特征,属性用数据结构来描述;对象的方法反映对象的行为特征,用属性的操作来描述。 (2)消息。消息是对某种对象处理的说明。消息用来请求对象执行某一种处理或回答某些信息的要求,消息统一了数据流和控制流,使数据流和
24、控制流采用同一种方法来实现,消息用消息模式刻画。对象的方法描述的是对消息如何响应的方法。面向对象的设计方法把一切控制结构的功能都通过对象及其相互间传递消息来实现。 (3)类和类层次。类是对一组对象的抽象,它将该组对象所具有的共同特征(包括操作特征和存储特征,即方法和属性)集中起来,由该组对象共享。在系统构成上则形成一个具有特定功能的模块和提供一种代码共享的手段。具体来讲,类是由方法和数据组成。它是关于对象性质的描述,包括外部特性和内部实现两个方面。类通过描述消息模式及其相应的处理能力来定义对象的外部特性,通过描述内部状态的表现形式及固有处理能力的实现来定义对象的内部实现。一个类的上层可以有父类
25、,下层可以有子类,形成一种层次结构。这种层次结构的一个重要特征是继承。继承具有传递性,一个类可继承层次结构中在其上面的所有类的全部描述。 (4)实例。实例是被某一个特定的类所描述的一个对象。每个对象都是某一个类的一个实例,而类是对各个实例的相似性的描述。 面向对象的软件开发技术综合了功能抽象与数据抽象,它的消息传递机制与分布式并行程序、多机系统和网络通讯模型相一致。不同对象间的消息传递体现了不同软件实体之间的交互与协作。与传统的软件设计方法不同,面向对象软件设计中的软件实体之间是藕合的。此外,面向对象软件设计中引入的继承等机制,实现了软件的可扩充性、多态性,并易于修改,因而这种设计是我们实现本
26、系统软件模块化,并使其具有重构能力的有效方法。2.3多线程技术 由于视频在网络中传输时有着较大的数据吞吐量,因此接收时常常会出现阻塞现象。为了在实际的视频传输应用中避免出现这种情形,提高传输的效率,在本论文设计中,我们采用了多线程技术7来进行网络编程。线程是进程内部一个独立的执行单元(可以是一个函数、一个活跃的类对象)。每个进程至少有一线程就是主线程,它是由系统启动应用程序后自动创建的,用户根据需要可以在应用程序中创建其他线程。 Windows 2000通过引入线程和进程来实现占先任务。处理器根据其优先级别的不同不断地切换执行系统中的各个线程,这种处理的高速度使人产生多个线程在同时执行的错觉,
27、操作系统不必等待某一个线程结束,可主动将处理器让给其他线程。线程转让CPU处理时间是被迫的,对于多线程的调度程序而言,可防止某一个线程过多地占用CPU时间导致系统效率降低。这些特点正好可以解决视频监控系统实时性方面要求较高的问题。MFC应用程序都有一个CWinApp派生类,而CWinApp则是线程基类CWmThread的派生类,它的对象就是启动应用程序系统创建进程的主执行线程。MFC类库支持两种线程类型:用户界面线程(user-interface thread)和工作线程(worker thread)。前者有一个消息泵,一般用于处理用户的输入和对用户生成的事件和消息的响应,它由类CWinThr
28、ead派生而来。而后者一般用于完成不需要用户输入的后台任务。如计算、调度等工作,它和用户界面线程不同,它不是从类中派生来创建,而是一个实现工作线程任务的运行控制函数。在本软件开发中,根据需要创建了多个工作线程,它们各自完成不同的后台任务。3开发实现系统的技术本章介绍本论文完成的重点任务所应用的关键技术。首节介绍Socket的背景与特点,接着介绍COM组件技术的基本原理和编程思想,引出简述DirectShow视频技术的工作原理和应用编程实现。3.1WinSock编程机制Socket简介: Socket是一种基于TCP/IP的网络编程接口,它采用客户/服务端通信模式,客户端和服务端通过Socket
29、接口在网络上实现连接和数据交换。它提供了一系列系统调用,使用户可以方便的使用TCP和UDP等网络协议8实现通信。 Socket最先是集成在UNIX系统中的,随着Windows操作系统的广泛使用,就制定了一套Windows下的TCP/IP网络编程接口标准,这就是WinSock。它给应用程序开发者提供了一套简单的API函数,通过调用这些API函数,程序员就能充分的利用Windows消息驱动机制进行网络编程。目前,WinSock已被集成到Windows95,Widows98,Windows2000,WindowsNT,WindowsXP中,它已成为Windows操作系统网络编程的标准。Windows
30、下的Internet软件大都是基于WinSock开发的。WinSock定义并记录了如何使用API函数与TCP/IP连接。应用程序通过调用WinSock的API函数实现相互之间的通信,WinSock又利用下层的网络通信协议和操作系统调用实现实际的通信工作。应用程序和WinSock之间的关系如下图2所示。应用程序二应用程序一网络通讯协议服务介面,例如TCP/IP网络编程介面,例如WinScok操作系统,例如Windows X物质传输介质图2应用程序和WinSock的关系图WinSock支持两种编程模式,一种是基于TCP协议的数据流模式,另一种是基于UDP协议的数据报模式。3.1.1基于TCP协议的
31、WinSock编程使用TCP协议实现的通信是面向连接的通信。这种通信方式要求通信双方在通信前必须先建立连接。类似于电话服务系统,每一次完整的通信过程都要经过建立连接、使用连接、终止连接三个过程。它具有确认、流量控制和拥塞控制等机制,可以为用户在不可靠的通信线路上提供可靠的、端到端的、全双工的数据流通信服务。当数据在传输过程中出错或丢失时,发送方就重发出错数据,以保证接收方能够按序接收到正确数据。WinSock基于TCP协议的编程步骤如下图3所示9。Create()创建一个套接字Bind()绑定到一个端口Listen()在该端口监听Accept()等待接受一个连接Receive()接受数据或Se
32、nd()发送数据Close()关闭套接字并断开连接Send()发送数据或Receive()接受数据Connect()向服务器一个端口发出连接请求Create()创建一个套接字阻塞式等待接受连接请求建立连接数据传输数据传输Close()关闭套接字并断开连接服务端程序客户端程序图3TCP客户端与TCP服务端进行连接的步骤在VC6的MFC(Microsoft基础类库)中提供了支持WinSock编程的类,主要有CAsyncSocket类和CSocket类。CAsyncSocket类封装了Windows Socket API函数,和Csocket类相比,它既有类库编程的方便性,又有Socket API函
33、数编程的灵活性。而Csocket类是CAsyncSocket类的继承类,它相对来说具有较高的抽象性。在用流套接字进行网络编程时,服务端进程首先调用CAsyncSocket类的成员函数Create()建立一个套接字,并用Bind()把它绑定到一个未使用的端口上,然后调用listen()函数在该端口监听连接请求。当没有连接请求时,服务端进程处于休眠状态。客户进程创建一个套接字并把它绑定到一个未使用的端口上后,就可以调用Connect()函数向服务端进程发出连接请求。当服务端进程监听到有客户端进程套接字向该端口发出连接请求时,服务端进程就被唤醒,生成一个新的字节流套接字,并用新套接字调用Accept
34、()函数同客户进程的套接字建立连接,而服务端进程最早生成的那个套接字则继续用于监听网络上的其他连接请求。连接建立成功后,双方就可以调用Send()或Receive()函数进行全双工的数据传输。通信结束后,通信双方分别调用Close()函数撤消套接字并断开连接。这样就完成了一次数据通信。3.1.2基于UDP协议的WinSock编程使用UDP协议实现的通信是面向无连接的通信。这种通信方式也叫做数据报通信方式。在通信前,双方无需建立连接,可直接收发数据。发送的每个分组都携带有完整的目的地址,各分组在网络中都独立传送。发送方不管对方是否收到或正确接收,只要有数据就发送,而接收方仅负责接收数据,不管数据
35、正确与否,且不向发送方发送应答信息。因此,在接收方不能保证收到分组的正确性和到达的先后顺序,分组在传输途中可能丢失或出错,而后发的分组也可能先到达。由于该通信方式取消了端到端的确认和重传机制,因此,在通信线路质量有保证的情况下,能够达到较高的通信速率。WinSock基于UDP协议的编程模型如图4所示。Create()创建一个套接字Bind()绑定到一个端口Close()关闭套接字Receive From()接受数据或SendTo()发送数据Create()创建一个套接字Bind()绑定到一个端口Close()关闭套接字SendTo()发送数据或Receive From()接受数据图4数据报套接
36、字应用程序时序图3.2COM成组件技术与DirectShow视频技术3.2.1COM组件技术COM的英文全称是Component Object Model,也就是组件对象模型。COM的发布形式是以win32动态链接库(DLL)或者可执行文件(EXE)的形式发布的可执行代码组成。COM组件是动态连接的,是完全与语言无关的。同时,COM组件可以以二进制的形式发布。COM组件10还可以在不妨碍老客户的情况下被升级成新的版本。COM的基础包括三样:接口、对象和类厂。在COM编程中,接口包括一系列相关的方法,对象实现一系列接口,而类厂是一个特殊的COM对象,它创建或实例化其余的COM对象。接口、对象和类
37、厂的图例符号如下表示:图5接口、对象和类厂的图例COM本身只是一种规范,而不是实现。如果使用C+来实现时,COM组件就是一个C+类,而接口都是纯虚类。按照约定俗成,接口都会带一个大写的前缀I,每一个接口都由一个128位的全局唯一标志符( GUID )来标识。可以用如下C+代码来简单描述一个COM组件。Class IfunctionPublic:Virtual Method1()=0;Virtual Method2()=0; /;Class MyObject:public IfunctionPublic:Virtual Method1();Virtual Method2(); /;图6C+代码表
38、示COM组件其中,Ifunction 就是常说的接口,而 MyObject 就是 COM 组件对象。图7MyObject组件对象示意图COM 规范要求所有兼容 COM 的接口必须由 IUnknown 派生出来。IUnknown定义了 3 个重要方法,分别是:HRESULT QueryInterface( const IID& iid,void *ppv );ULONG AddRef(void);ULONG Release(void);图8接口IUnknow的3个函数其中,QeryInterface 负责组件对象上的接口查询,以获取该对象上提供的其余服务;AddRef 用于增加引用计数,Rele
39、ase用于减少引用计数。每当COM组件对象被引用一次就应调用一次方法AddRef,而当释放COM组件对象的某一接口时就应调用相应的 Release方法。引用计数是COM中的一个非常重要的概念,它很好地解决了组件对象什么时候被销毁,以及由谁来销毁的生命周期问题。除了 IUnknown 接口外,还有一个重要的接口:IClassFactory。COM规范规定,每个组件都必须实现一个与之相对应的类厂( Class Factory )。类厂也是一个COM组件,它实现了IClassFactory。图9类厂与COM组件对象的关系COM组件有2种基本类型:进程内服务端组件、进程外服务端组件。本论文主要采用进程
40、内服务端组件类型进行开发,因而后面谈及的是以进程内服务端组件为为基础的。在 COM 库中,有三个 API 函数可用来创建对象:CoGetClassObject、CoCreateInstance、CoCreateInstanceEx 。进程内服务端组件对象的创建流程大概如下:COM 客户程序调用 CoGetClassObject,而 CoGetClassObject 调用DLL 模块的 DllGetClassObject 引出函数,将参数 clsid、iid、ppv 传给DllGetClassObject 函数,并返回类厂对象的接口指针。然后调用类工厂的接口方法 IClassFactory:Cr
41、eateInstance 即可真正创建 CLSID_Object 标识的组件对象。图10COM对象创建过程示意图对于 CoCreateInstance 来说,它其实是一个封装了类厂对象创建过程的辅助函数,其内部实际调用了 CoGetClassObject 函数。客户程序只需指明对象类的 CLSID、接口 IID 和输出的接口指针,不需与类厂打交道即可创建 COM 组件对象。对于 CoCreateInstanceEx 来说,其主要用于创建进程外服务端组件对象。3.2.2DirectShow视频技术DirectX 软件开发包是微软公司提供的一套在 Windows 操作平台上开发高性能图形、声音、输
42、入、输出和网络游戏的编程接口。因DirectX采用了组件对象模型(COM)标准技术,故使用DirectX SDK开发多媒体应用程序前,应对COM组件技术有基本的理解。DirectShow 作为 DirectX 大家族的一员,为 Windows 平台上处理各种格式的媒体文件的回放、音视频采集等高性能要求的多媒体应用,提供了完整的解决方案。Filter是DirectShow中最基本的概念。DirectShow使用Filter Graph来管理Filter, Filter Graph是Filter的容器,而Filter是Filter Graph中的最小功能模块。Filter一般由一个或多个Pin组成
43、,Filter之间通过Pin相互连接, 构成一条顺序的链路。仅含有输出Pin,没有输入Pin的Filter为Source Filter;既有输入Pin也有输出Pin的Filter为Transform Filter;只有输入Pin,没有输出Pin的Filter为Rendering Filter。3 种Filter在GraphEdit11下显示如下图:图113种Filter类型Filter 是一种 COM 组件,实现 Filter 的文件一般是一个 DLL,使用前必须先注 册 。 Filter 的 创 建 与 普 通 的 COM 组 件 一 样 , 通 过 API 函 数CoCreateInsta
44、nce()来完成。DirectShow系统概述:DirectShow系统位于应用层中,它使用一种叫Filter Graph过滤图的模型来管理整个数据流的处理过程;参与数据处理的各个功能模块叫做Filter过滤器;各个Filter在Filter Graph中按一定的顺序连接成一条“流水线”协同工作。图12DirectShow系统(源自DirectX SDK9.0)按功能分,如上图所列,Filter 大致分为:Source Filters、Transform Filters 和 Rendering Filters。Source Filters 主要负责获取数据,数据源可以是文件、因特网、计算机里的
45、采集卡(WDM 驱动的或 VFW 驱动的)数字摄像机等等,然后将数据往下传输;Transform Filters 主要负责数据的格式转换,例如数据流的分离合成、解码编码等,然后将数据继续往下传输;Rendering Filters 主要负责数据的最终去向将数据送给显卡、声卡进行多媒体的演示,或者输出到文件进行存储。开发DirectShow应用程序的一般过程:3个阶段。第1阶段:具体调用 CoCreateInstance()创建一个 Filter Graph Manger组件。第2阶段:根据实际的应用,创建一条完整的 Filter 链路。具体智能构建方法大体有:AddFilter,ConnectDirect,AddSourceFilter,Connect, Render,RenderFile。第3阶段:调用 QueryInterface()查询获取 Filter Graph Manager 上的各个接口,并调用相应的方法进行控制,完成 Filter Graph Manager 与应用程序的事件交互。图13开发DirectShow应用程序过程(源自DirectXSDK9.0)本章小结本章简述论文具体设计实现系统所需掌握的关键技术,为下面章节详细阐述的各功能模块设计和编程实现作好铺垫,也为其他正在从事网络视频监控或者有关视频开发的朋友提供有效的思路。4系统构成与功能模块设计本章主要讲
链接地址:https://www.31ppt.com/p-2393874.html