1、基于DirectShow的P2P网络视频采集传输与播放系统软件技术课程设计实验报告基于 DirectShow 的 P2P 网络视频采集、传输与播放系统)一. 概述DirectShow 是一个 windows 平台上的流媒体框架,提供了高 质量的多媒体流采集和回放功能。它支持多种多样的媒体文件格式, 包括 ASF、MPEG、 AVI、MP3 和 WAV 文件。同时 DirectShow 支 持使用 WDM 驱动或早期的 VFW 驱动来进行多媒体流的采集。 DirectShow 整合了其它的 DirectX 技术,能自动地侦测并使用可利 用的音视频硬件加速,也能支持没有硬件加速的系统。Direct
2、Show 大大简化了媒体回放、 格式转换和采集工作。 但与 此同时,它也为用户自定义的解决方案提供了底层流控制框架, 从而 使用户可以自行创建支持新的文件格式或其它用途的 DirectShow 组件。DirectShow 的主要功能是提供对多媒体流的捉捕与回放。 这种 多媒体流既可以来自本地磁盘文件,也可以来自网络上的远程服务 器。也就是说,它提供了一种“在线播放”的功能,在远程数据尚未 完全传输到本地机器上的同时, 本地应用程序可不必等待数据完全传 输完毕再进行播放, 可以一边传输, 一边播放。 这就为网络化的视频 采集数据的实时解码显示提供一个方便的开发平台。点对点技术(peer-to-p
3、eer ,简称P2P)又称对等互联网络技 术,是一种网络新技术, 依赖网络中参与者的计算能力和带宽, 而不 是把依赖都聚集在较少的几台服务器上。 P2P 网络通常用于通过连 接来连接节点。 这类网络可以用于多种用途, 各种文件共享软件已经 得到了广泛的使用。 P2P 技术也被使用在类似 VoIP 等实时媒体业务 的数据通信中。二 . 需求分析2.1 开发要求1.熟悉、掌握 vs2010 开发工具,以及 DirectShow SDK9.0 软件开 发包。2.熟悉了解 Socket 网络编程;3.开发基于 DirectShow 的应用软件,要求能够完成 P2P 的网络视 频采集、视频传输、视频播放
4、的功能。4.基本功能:实现采集视频、传输视频、实现异地播放采集视频。2.2 开发平台1.硬件:视频摄像头一个, PC 机两台,局域网。2.软件 :操作系统 WindowsXP ,安装 TCP/IP 协议。视频摄像头 驱 动 程 序 。 开 发平 台 Visual Studio 2010 。 软 件 开 发 包 DirectShow SDK9.0 。3.语言: C+实现原理1.DirectShow 系统DirectShow的核心部分为过滤器(Filter),过滤器是一个COM组件,是完成DirectShow处理过程的基本单元。ApplicationCommandsSfenVF-DirectSho
5、wLegacyVCM/ACMCodecsFileSystem图中最大的一块即是 DirectShow系统,它的基本工作原理就是“流水线”:将单元组件Filter串联一起,交由Filter Graph Manager统一控制。系统的输入可以是本地文件系统、硬件插件、因特网等,系统的输出可以是声卡(声音再现),显卡(视频内容显示),本地文件 系统,当然也可以最终将数据向网络发送。在 DirectShow 系统之上是应用程序 (Application) 。应用程序 要按照程序所要实现的功能建立起相应的 Filter Graph , 然后借助于 Filter Graph Manager 来控制整个数据
6、的处理过程。 DirectShow 能在 Filter Graph 运行的时候接收到各种事件 ,并通过消息的方式发 送到应用程序。这样就实现了应用程序与 DirectShow 系统之间的 交互。DirectShow 的基本单元是过滤器 Filter ,按照功能来分, Filter 大致分为三类: Source Filters 、Transform Filters 和 Rendering Filters 。各类 Filter 如下:( 1)源过滤器, Source Filters 主要负责取得数据,它代表数据源。 数据源可以是多媒体文件、 因特网、 或者视频和音频捕获设备, 如计 算机里的采集卡
7、( WDM 驱动的或是 VFW 驱动的)、数字摄 像机等, 然后将数据往下传输。 此外,也可以将网络传输的数据作为 数据源。 可以将几种数据源组合使用; 但是,只能同时有一个视频数 据源和一个音频数据源,不能出现同时有两个或两个以上视频数 据源或音频数据源的情况。( 2)转换过滤器,它位于源过滤器和播放过滤器之间, Transform Filters 主要负责数据的格式转换,然后将数据继续往下传输。转换 过滤器主要有三类: 一类是编码器, 包括视频和音频编码器; 一类是 解码器,同样也包括视频解码器和音频解码器; 还有一类是一些中间的辅助Filter,可以实现一些特殊的功能,比如媒体数据的分流
8、和合 流。(3)渲染过滤器,这种Filter终止数据流,Rendering Filters 主要 负责数据的最终去向数据流的目的有三个: 一是播放器,对应视频数 据流,可以将其在屏幕上某个区域内显示出来, 对应音频数据流,则 可以通过声卡,在音箱或耳机中播放;二是文件,可以将数据流写入 到指定的文件中,保存在当地主机上;三是网络,发送端通过网络将 媒体数据传输到接收端,对于发送端而言,这也是一个数据流终点。2.基于DirectShow的视频采集系统的结构整个视频采集系统的框架如上图所示,其中箭头符号表示视频数据流动的方向。从图中可以清楚地看到,最初的视频信号经 CCD摄像机和WDM视频采集卡进
9、入计算机,其后系统的软件部分通过WDM视频采集卡驱动程序采集这些视频数据。3.数据整体传输框图厂将视频数据发向网络远程端Video Capture 一Net Sender 将音频数据发 ”尢向网络远程端Audio Capture _Net Sender图一:将本地采集的音视频发向网络远程端从网络远程端接收视频数据从网貉远程端 接收門频数据图二:播放从网络远程端接收的音视频因为音视频数据是大量的、连续的、需要可靠传输的,因此这些数据的传输可以选用TCP协议。而通信双方的控制命令数据量很小, 而且重要性也不是很强,因此可以选用 UDP 协议。为了让在 Socket 上传输的数据简单化或者说提高 S
10、ocket 传输的效率, AVChat 程序 将音频数据和视频数据的传输分离,分别为它们创建一条 Socket 连 接。而在单个 Socket 上,可以同时进行数据的发送和接收。4.socket 网络SOCKET 用于在两个基于 TCP/IP 协议的应用程序之间相互通 信。客户方和服务方。当两个应用之间需要采用 SOCKET通信时, 首先需要在两个应用之间 (可能位于同一台机器, 也可能位于不同的 机器)建立SOCKET连接,发起呼叫连接请求的一方为客户方,接 受呼叫连接请求的一方成为服务方。 客户方和服务方是相对的, 同一 个应用可以是客户方,也可以是服务方。在客户方呼叫连接请求之前, 它必
11、须知道服务方在哪里。 所以需 要知道服务方所在机器的 IP 地址或机器名称,如果客户方和服务方 事前有一个约定就好了,这个约定就是PORT (端口号)。也就是说, 客户方可以通过服务方所在机器的 IP 地址或机器名称和端口号唯一 的确定方式来呼叫服务方。 在客户方呼叫之前, 服务方必须处于侦听 状态, 侦听是否有客户要求建立连接。 一旦接到连接请求, 服务方可 以根据情况建立或拒绝连接。 客户方发送的消息可以是文本, 也可以 是二进制信息流。 当客户方的消息到达服务方端口时, 会自动触发一 个事件( event ),服务方只要接管该事件,就可以接受来自客户方的消息了。总之,在此程序中,客户端和
12、服务端的交互流程设计如下 图所示:评卄luwfJJUl厂的UDP命专I响用甲itifall 愷钮的崗息 itiS. J cmdjCIiffitCailing、耳 fUKWNn)I:的UDP曲令 =fh!lf lOOWJrSUJ 匕的T( Pitft换取辔户机的阳地叶耽送Bi务器常带宝进毎舸配買愷息为视颖麹豔的TCT札输追工一鹤沁址连屡确认连接対荷颉首拥的TCFfL怖建足一菇笛血戏樓埔认连接;* ? cnid扛I LldFitri j raph莉光林骗一执独拓Ifr式%成播放陌祚淮拱的Filler和他間牌科建何将N rt Receiver Reiitfertf Filler fl I ii)并运
13、*它总结:在实现原理这一段,我简单地描述了 DirectShow系统的工作原理,以及此音视频聊天程序实现的整体构架。 其中,整体构架大概可以分为三部分:首先,对于音视频数据的采集;其次,服务端与客 户端网络的连接;最后,相互之间数据的传输与处理。通过对程序整 体构架的了解,可以帮助我们更加容易和清晰地了解整个程序地实现 过程。4.软件的设计模块本音视频聊天程序共分为了六大模块, 接下来便一一分析这些模 块所实现的功能。1.Source Files 模块Source Files 模块主要实现是界面的设计功能。 它主要包括了以 下四个类: CAVChatDlg 用于主界面功能设计; CRoleDl
14、g 用于角色 选择对话框的功能实现; CSelfCheckDlg 用于本地采集设备自检对话 框的功能实现; CCallDlg 用于呼叫服务器界面(用于指定服务器 IP 地址)。2.DirectShow 模块DirectShow 模块里面主要封装了关于 DirectShow 系统的一些 应用类以及某些过滤器的设定功能。它主要包括了以下三个大类: Basic 基本的 DirectShow 应用类; Device 采集设备包装类; Filters 过滤器设定类。这些大的类里面还包括了以下几个类: CDXGraph 封装了 Filter Graph 的控制功能; CDXFilter 类 Filter
15、的包装类,并作为具体 Filter 包装类的父类; CvideoWindow 类 用于视频显示窗口; UDsUtils 工具类,完成了 DirectShow 相关的一系列相对独立的功 能(比如创建设备 Filter 、显示 Filter 的属性页等) ;UFilterUtils 完 成了 Filter 相关的一系列相对独立的功; CAVDevice 用于保存音视 频采集设备信息(比如设备的显示名字、友好名字、设备类型等); CaudioCaptureFilter 音频采集设备的包装 Filter ,用于音频采集设 备的创建、参数设置等; CVideoCaptureFilter 视频采集设备的包
16、 装 Filter ,用于视频采集设备的创建、 参数设置等; CFilterNetSender 用于向网络发送音视频数据的 Filter (Net Sender ); CXInputPin Net Sender 的输入 Pin ;CFilterNetReceiver 用于接收来自网络的 音视频数据的 Filter (Net Receiver ); CnetOutPin Net Receiver 的输出 Pin ;3.Socket 模块Socket 模块用于控制服务端与客户端之间网络通信的连接。它 分为以下三个类: CTCPListener 监听 TCP 连接的 Socket 包装类; CStr
17、eamSocket 用于 TCP 协议进行数据的发送和接收; CUDPManager 用于 UDP 协议进行数据的发送和接收。4.Controller 模块Controller 模块用于客户端与服务端的角色控制。 它分为以下四 个类: CPreviewAdmin 用于本地采集设备自检的控制类,并作为 角色控制类的父类,负责 Filter Graph 的构建、控制、销毁; CroleAdmin 用于角色控制的基类,完成服务器和客户机两种角色 控制逻辑中的公共部分; CserverAdmin 服务器进程使用的角色控 制类; CClientAdmin 客户机进程使用的角色控制类。以上总结了音视频程序
18、所包含的四大模块, 以及每个模块里不同 类的作用和相互之间的关系。清晰明了地将整个程序的结构展现出 来,加强了对程序功能的理解与认识。5.软件重要部分介绍1.采集设备的自检功能在进入真正意义上的视频聊天阶段之前,通信双方最好能对本 地的采集设备进行一下检测, 并且把各自的配置情况告诉对方。 因为 如果本地没有视频采集设备, 那么远程端的用于接收网络视频数据的 Filter Graph 就不用构建;音频的情况类似。反之亦然。在本程序中 使用了一个 CPreviewAdmin 类来实现此功能。2.角色控制功能在建立网络连接之前, 通信双方扮演的角色是不一样的, 而且必 须一个是服务器,一个是客户机
19、。于是出现了问题:角色不同,要求 的控制逻辑也不会一样,但要在同一个程序中实现。这显然对 AVChat 程序的设计提出了更高的要求。本程序使用一个 CRoleAdmin 类来 实现服务器和客户机两种角色控制的共性,然后以 CRoleAdmin 为 父类,派生一个 CServerAdmin 类专门定制服务器的特性,派生一 个 CClientAdmin 类专门定制客户机的特性。 考虑到角色控制同样也 包括对 Filter Graph 的控制,因此将 CRoleAdmin 类 CPreviewAdmin 类派生。 关于服务器和客户机之间的通信, AVChat 程序将监听 TCP 连接的 Socket
20、 放在客户机程序, 传输控制命令使用 UDP 协议,而传输媒体数据使用 TCP 协议。传输的 UDP 数据和 TCP 数据都有自己定义的格式。3.网络发送 Filter 与网络接收 Filter在 DirectShow 中, Filter 之间的数据传送以 Sample 的形式 来完成。对于接入链路的任何一个 Filter 来说,都有机会获得数据流 中的每一个 Sample 。因此, AVChat 程序需要开发一个 Filter 接到 采集设备 Filter 的后面,以获取采集输出的数据, 然后才能向网络远 程端发送。这个 Filter 就是上面图一中的 Net Sender 。很显然, Ne
21、t Sender 是一个 Renderer Filter (因为它没有输出 Pin )。因此,Filter 的父类可以选择 CBaseFilter 类,输入 Pin 的父类选择CRenderedInputPin 类。又因为 Net Sender 只在本程序中使用, 因 此可以将它写成一种应用程序内的 Filter 形式。同时,本程序也需要开发一个 Filter 用于接收网络数据, 然后 再将接收到的数据从该 Filter 的输出 Pin 上传送给下一级 Filter 。这 个用于网络接收的 Filter 就是上面图二中的 Net Receiver 。 Net Receiver 和 Net Se
22、nder 的实现有些类似,都是一种应用程序内的 Filter 形式。不过, Net Receiver 的具体实现要比 Net Sender 复杂 一点: Net Receiver 需要使用独立的线程进行网络数据的接收;当 接收到第一个媒体格式数据后,必须马上通知上层应用程序完成Filter Graph 的构建;然后继续接收媒体数据,并将这些数据以Sample 的形式“推”给下一级 Filter 。6.设计过程中遇到的困难1.对与C+语言以及VS2010开发平台不熟由于我们之前所学习的课程只涉及到 C语言以及VC+6.0开发 平台,因此,在程序开发的初级阶段, 最主要的问题便出现在对语言 以及开
23、发环境的不熟上。 通过查找书籍, 上网查找资料等方式慢慢克 服了这个难题。2.平台的环境配置问题在学习 DirectShow 的过程中,发现在 VS2010 平台上程序总是 运行出错,最后网上查找资料才发现时环境配置问题。 最后的解决方 法是在下载安装 DirectShow 之后编译 baseclasses 项目,在 C:Program Files MicrosoftSDKs Windows v7.1Samples multimedia directshow baseclasses 选择不同的编译环境可以 得到四个类型的 strmbasd.lib ,开发项目时选择相应版本的 strmbasd.
24、lib 。在编译的时候没错误提示,看来选择新版本还是有好 处的。在项目中包含 include :C:Program FilesMicrosoft SDKsWindowsv7.1IncludeC:Program FilesMicrosoftSDKsWindowsv7.1Samplesmultimediadirectshowbaseclasses以及 lib :C:Program FilesMicrosoft SDKsWindowsv7.1LibC:Program FilesMicrosoft SDKsWindowsv7.1Samplesmultimediadirectshowbasecla ss
25、esDebug (这个要根据所需要的 strmbasd.lib 版本进行选择)3.声音滞后问题在使用本程序进行视频聊天时, 会感到对方说话的声音有些滞后。 这 是因为音频采集设备默认情况下使用的采集缓存能够容纳 500ms 的 数据。只有采集满了 500ms 数据后,音频采集设备 Filter 才会送出 一个 Sample 。而视频采集以帧率 25fps 为例,视频采集设备 Filter 每输出一个 Sample (也就是一帧图像)的时间间隔是 40ms 。也就 是说,音频数据要比视频数据迟送出来 460ms 。于是,在远程端接 收到数据后进行播放时, 音视频不同步也就不奇怪了。 解决方法也很
26、 简单,只要在本地采集时减小音视频数据采集送出的时间差即可。 也 就是在 CAudioCaptureFilter2 类中成功创建了音频采集设备 Filter 之后,随即调用 CaudioCapture Filter2:SetCaptureBufferSize 函 数进行音频采集缓存大小的调整。4.Dubeg 与 Relese 编译的不同在程序完成之后,发现用 Dubeg 编译生成的 EXE 文件无法在没 有 VS2010 平台的电脑上运行。经过查找资料发现, Dubeg 是用来 调试程序的, 用 Relese 编译程序生成的 EXE 文件才是可以发布的程 序。七 . 感想与总结通过本次软件设计, 让我了解了什么是 DirectShow ,P2P,TCP、 UDP 传输协议和 VS2010 开发平台。也了解了一些视频聊天程序的 开发思路。 同时,通过本次设计, 让我学会了许多有关类和封装的知 识。最重要的是, 这次设计让我对一个软件的开发过程有了深入的了 解。四. 参考资料a) DirectShow 开发指南 陆其明,清华大学出版社, 2003 年12 月出版;b) DirectShow 实务精选 陆其明,科学出版社, 2004 年 7 月出版。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1