基于DirectShow的P2P网络视频采集传输与播放系统.docx

上传人:b****3 文档编号:27560803 上传时间:2023-07-02 格式:DOCX 页数:12 大小:179.70KB
下载 相关 举报
基于DirectShow的P2P网络视频采集传输与播放系统.docx_第1页
第1页 / 共12页
基于DirectShow的P2P网络视频采集传输与播放系统.docx_第2页
第2页 / 共12页
基于DirectShow的P2P网络视频采集传输与播放系统.docx_第3页
第3页 / 共12页
基于DirectShow的P2P网络视频采集传输与播放系统.docx_第4页
第4页 / 共12页
基于DirectShow的P2P网络视频采集传输与播放系统.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

基于DirectShow的P2P网络视频采集传输与播放系统.docx

《基于DirectShow的P2P网络视频采集传输与播放系统.docx》由会员分享,可在线阅读,更多相关《基于DirectShow的P2P网络视频采集传输与播放系统.docx(12页珍藏版)》请在冰豆网上搜索。

基于DirectShow的P2P网络视频采集传输与播放系统.docx

基于DirectShow的P2P网络视频采集传输与播放系统

软件技术课程设计实验报告

基于DirectShow的P2P网络视频采集、传输与播放系统)

一.概述

DirectShow是一个windows平台上的流媒体框架,提供了高质量的多媒体流采集和回放功能。

它支持多种多样的媒体文件格式,包括ASF、MPEG、AVI、MP3和WAV文件。

同时DirectShow支持使用WDM驱动或早期的VFW驱动来进行多媒体流的采集。

DirectShow整合了其它的DirectX技术,能自动地侦测并使用可利用的音视频硬件加速,也能支持没有硬件加速的系统。

DirectShow大大简化了媒体回放、格式转换和采集工作。

但与此同时,它也为用户自定义的解决方案提供了底层流控制框架,从而使用户可以自行创建支持新的文件格式或其它用途的DirectShow组件。

DirectShow的主要功能是提供对多媒体流的捉捕与回放。

这种多媒体流既可以来自本地磁盘文件,也可以来自网络上的远程服务器。

也就是说,它提供了一种“在线播放”的功能,在远程数据尚未完全传输到本地机器上的同时,本地应用程序可不必等待数据完全传输完毕再进行播放,可以一边传输,一边播放。

这就为网络化的视频采集数据的实时解码显示提供一个方便的开发平台。

点对点技术(peer-to-peer,简称P2P)又称对等互联网络技术,是一种网络新技术,依赖网络中参与者的计算能力和带宽,而不是把依赖都聚集在较少的几台服务器上。

P2P网络通常用于通过连接来连接节点。

这类网络可以用于多种用途,各种文件共享软件已经得到了广泛的使用。

P2P技术也被使用在类似VoIP等实时媒体业务的数据通信中。

二.需求分析

2.1开发要求

1.熟悉、掌握vs2010开发工具,以及DirectShowSDK9.0软件开发包。

2.熟悉了解Socket网络编程;

3.开发基于DirectShow的应用软件,要求能够完成P2P的网络视频采集、视频传输、视频播放的功能。

4.基本功能:

实现采集视频、传输视频、实现异地播放采集视频。

2.2开发平台

1.硬件:

视频摄像头一个,PC机两台,局域网。

2.软件:

操作系统WindowsXP,安装TCP/IP协议。

视频摄像头驱动程序。

开发平台VisualStudio2010。

软件开发包DirectShowSDK9.0。

3.语言:

C++

实现原理

1.DirectShow系统

DirectShow的核心部分为过滤器(Filter),过滤器是一个COM

组件,是完成DirectShow处理过程的基本单元。

Application

Commands

S

fen——

V

F-

DirectShow

Legacy

VCM/ACM

Codecs

File

System

图中最大的一块即是DirectShow系统,它的基本工作原理就是

“流水线”:

将单元组件Filter串联一起,交由FilterGraphManager

统一控制。

系统的输入可以是本地文件系统、硬件插件、因特网等,

系统的输出可以是声卡(声音再现),显卡(视频内容显示),本地文件系统,当然也可以最终将数据向网络发送。

在DirectShow系统之上是应用程序(Application)。

应用程序要按照程序所要实现的功能建立起相应的FilterGraph,然后借助于FilterGraphManager来控制整个数据的处理过程。

DirectShow能在FilterGraph运行的时候接收到各种事件,并通过消息的方式发送到应用程序。

这样就实现了应用程序与DirectShow系统之间的交互。

DirectShow的基本单元是过滤器Filter,按照功能来分,Filter大致分为三类:

SourceFilters、TransformFilters和RenderingFilters。

各类Filter如下:

(1)源过滤器,SourceFilters主要负责取得数据,它代表数据源。

数据源可以是多媒体文件、因特网、或者视频和音频捕获设备,如计算机里的采集卡(WDM驱动的或是VFW驱动的)、数字摄像机等,然后将数据往下传输。

此外,也可以将网络传输的数据作为数据源。

可以将几种数据源组合使用;但是,只能同时有一个视频数据源和一个音频数据源,不能出现同时有两个或两个以上视频数据源或音频数据源的情况。

(2)转换过滤器,它位于源过滤器和播放过滤器之间,TransformFilters主要负责数据的格式转换,然后将数据继续往下传输。

转换过滤器主要有三类:

一类是编码器,包括视频和音频编码器;一类是解码器,同样也包括视频解码器和音频解码器;还有一类是一些中间

的辅助Filter,可以实现一些特殊的功能,比如媒体数据的分流和合流。

(3)渲染过滤器,这种Filter终止数据流,RenderingFilters主要负责数据的最终去向数据流的目的有三个:

一是播放器,对应视频数据流,可以将其在屏幕上某个区域内显示出来,对应音频数据流,则可以通过声卡,在音箱或耳机中播放;二是文件,可以将数据流写入到指定的文件中,保存在当地主机上;三是网络,发送端通过网络将媒体数据传输到接收端,对于发送端而言,这也是一个数据流终点。

2.

基于DirectShow的视频采集系统的结构

整个视频采集系统的框架如上图所示,其中箭头符号表示视频数

据流动的方向。

从图中可以清楚地看到,最初的视频信号经CCD摄

像机和WDM视频采集卡进入计算机,其后系统的软件部分通过

WDM视频采集卡驱动程序采集这些视频数据。

3.数据整体传输框图

厂将视频数据发

向网络远程端

VideoCapture□一NetSender

将音频数据发”尢向网络远程端

AudioCapture□__NetSender

图一:

将本地采集的音视频发向网络远程端

从网络远程端

接收视频数据

从网貉远程端接收門频数据

 

图二:

播放从网络远程端接收的音视频

因为音视频数据是大量的、连续的、需要可靠传输的,因此这些

数据的传输可以选用TCP协议。

而通信双方的控制命令数据量很小,而且重要性也不是很强,因此可以选用UDP协议。

为了让在Socket上传输的数据简单化或者说提高Socket传输的效率,AVChat程序将音频数据和视频数据的传输分离,分别为它们创建一条Socket连接。

而在单个Socket上,可以同时进行数据的发送和接收。

4.socket网络

SOCKET用于在两个基于TCP/IP协议的应用程序之间相互通信。

客户方和服务方。

当两个应用之间需要采用SOCKET通信时,首先需要在两个应用之间(可能位于同一台机器,也可能位于不同的机器)建立SOCKET连接,发起呼叫连接请求的一方为客户方,接受呼叫连接请求的一方成为服务方。

客户方和服务方是相对的,同一个应用可以是客户方,也可以是服务方。

在客户方呼叫连接请求之前,它必须知道服务方在哪里。

所以需要知道服务方所在机器的IP地址或机器名称,如果客户方和服务方事前有一个约定就好了,这个约定就是PORT(端口号)。

也就是说,客户方可以通过服务方所在机器的IP地址或机器名称和端口号唯一的确定方式来呼叫服务方。

在客户方呼叫之前,服务方必须处于侦听状态,侦听是否有客户要求建立连接。

一旦接到连接请求,服务方可以根据情况建立或拒绝连接。

客户方发送的消息可以是文本,也可以是二进制信息流。

当客户方的消息到达服务方端口时,会自动触发一个事件(event),服务方只要接管该事件,就可以接受来自客户方

的消息了。

总之,在此程序中,客户端和服务端的交互流程设计如下图所示:

评卄luwfJJUl}厂

的UDP命专I

响用甲itifall愷钮的崗息itiS.J^cmdjCIiffitCailing

、'耳f^UKWN^n

)I:

的UDP曲令=f'h>!

lflOOWJrSU

J匕的T(Pitft

换取辔户机

的阳地叶

耽送Bi务器常带宝进毎舸配買愷息

为视颖麹豔的TCT札输追工一鹤沁址连屡

确认连接

対荷颉首拥的TCFfL怖建足一菇笛血戏樓

埔认连接

;*?

cnid」扛ILldFi"trijraph

莉光林骗一执独拓Ifr式

%成播放陌祚¥淮拱的Filler和他間牌科建何将

NrtReceiverReiitfertfFillerflIii)・并运*]它

总结:

在实现原理这一段,我简单地描述了DirectShow系统的工作

原理,以及此音视频聊天程序实现的整体构架。

其中,整体构架大概

可以分为三部分:

首先,对于音视频数据的采集;其次,服务端与客户端网络的连接;最后,相互之间数据的传输与处理。

通过对程序整体构架的了解,可以帮助我们更加容易和清晰地了解整个程序地实现过程。

4.软件的设计模块

本音视频聊天程序共分为了六大模块,接下来便一一分析这些模块所实现的功能。

1.SourceFiles模块

SourceFiles模块主要实现是界面的设计功能。

它主要包括了以下四个类:

CAVChatDlg用于主界面功能设计;CRoleDlg用于角色选择对话框的功能实现;CSelfCheckDlg用于本地采集设备自检对话框的功能实现;CCallDlg用于呼叫服务器界面(用于指定服务器IP地址)。

2.DirectShow模块

DirectShow模块里面主要封装了关于DirectShow系统的一些应用类以及某些过滤器的设定功能。

它主要包括了以下三个大类:

Basic基本的DirectShow应用类;Device采集设备包装类;Filters过滤器设定类。

这些大的类里面还包括了以下几个类:

CDXGraph封装了FilterGraph的控制功能;CDXFilter类Filter的包装类,并作为具体Filter包装类的父类;CvideoWindow类用于视频显示窗口;UDsUtils工具类,完成了DirectShow相关的一系列相对独立的功能(比如创建设备Filter、显示Filter的属性页等);UFilterUtils完成了Filter相关的一系列相对独立的功;CAVDevice用于保存音视频采集设备信息(比如设备的显示名字、友好名字、设备类型等);CaudioCaptureFilter音频采集设备的包装Filter,用于音频采集设备的创建、参数设置等;CVideoCaptureFilter视频采集设备的包装Filter,用于视频采集设备的创建、参数设置等;CFilterNetSender用于向网络发送音视频数据的Filter(NetSender);CXInputPinNetSender的输入Pin;CFilterNetReceiver用于接收来自网络的音视频数据的Filter(NetReceiver);CnetOutPinNetReceiver的输出Pin;

3.Socket模块

Socket模块用于控制服务端与客户端之间网络通信的连接。

它分为以下三个类:

CTCPListener监听TCP连接的Socket包装类;CStreamSocket用于TCP协议进行数据的发送和接收;CUDPManager用于UDP协议进行数据的发送和接收。

4.Controller模块

Controller模块用于客户端与服务端的角色控制。

它分为以下四个类:

CPreviewAdmin用于本地采集设备自检的控制类,并作为角色控制类的父类,负责FilterGraph的构建、控制、销毁;CroleAdmin用于角色控制的基类,完成服务器和客户机两种角色控制逻辑中的公共部分;CserverAdmin服务器进程使用的角色控制类;CClientAdmin客户机进程使用的角色控制类。

以上总结了音视频程序所包含的四大模块,以及每个模块里不同类的作用和相互之间的关系。

清晰明了地将整个程序的结构展现出来,加强了对程序功能的理解与认识。

5.软件重要部分介绍

1.采集设备的自检功能

在进入真正意义上的视频聊天阶段之前,通信双方最好能对本地的采集设备进行一下检测,并且把各自的配置情况告诉对方。

因为如果本地没有视频采集设备,那么远程端的用于接收网络视频数据的FilterGraph就不用构建;音频的情况类似。

反之亦然。

在本程序中使用了一个CPreviewAdmin类来实现此功能。

2.角色控制功能

在建立网络连接之前,通信双方扮演的角色是不一样的,而且必须一个是服务器,一个是客户机。

于是出现了问题:

角色不同,要求的控制逻辑也不会一样,但要在同一个程序中实现。

这显然对AVChat程序的设计提出了更高的要求。

本程序使用一个CRoleAdmin类来实现服务器和客户机两种角色控制的共性,然后以CRoleAdmin为父类,派生一个CServerAdmin类专门定制服务器的特性,派生一个CClientAdmin类专门定制客户机的特性。

考虑到角色控制同样也包括对FilterGraph的控制,因此将CRoleAdmin类CPreviewAdmin类派生。

关于服务器和客户机之间的通信,AVChat程序将监听TCP连接的Socket放在客户机程序,传输控制命令使用UDP协议,而传输媒体数据使用TCP协议。

传输的UDP数据和TCP数据都有自己定义的格式。

3.网络发送Filter与网络接收Filter

在DirectShow中,Filter之间的数据传送以Sample的形式来完成。

对于接入链路的任何一个Filter来说,都有机会获得数据流中的每一个Sample。

因此,AVChat程序需要开发一个Filter接到采集设备Filter的后面,以获取采集输出的数据,然后才能向网络远程端发送。

这个Filter就是上面图一中的NetSender。

很显然,NetSender是一个RendererFilter(因为它没有输出Pin)。

因此,Filter的父类可以选择CBaseFilter类,输入Pin的父类选择

CRenderedInputPin类。

又因为NetSender只在本程序中使用,因此可以将它写成一种应用程序内的Filter形式。

同时,本程序也需要开发一个Filter用于接收网络数据,然后再将接收到的数据从该Filter的输出Pin上传送给下一级Filter。

这个用于网络接收的Filter就是上面图二中的NetReceiver。

NetReceiver和NetSender的实现有些类似,都是一种应用程序内的Filter形式。

不过,NetReceiver的具体实现要比NetSender复杂一点:

NetReceiver需要使用独立的线程进行网络数据的接收;当接收到第一个媒体格式数据后,必须马上通知上层应用程序完成

FilterGraph的构建;然后继续接收媒体数据,并将这些数据以

Sample的形式“推”给下一级Filter。

6.设计过程中遇到的困难

1.对与C++语言以及VS2010开发平台不熟

由于我们之前所学习的课程只涉及到C语言以及VC++6.0开发平台,因此,在程序开发的初级阶段,最主要的问题便出现在对语言以及开发环境的不熟上。

通过查找书籍,上网查找资料等方式慢慢克服了这个难题。

2.平台的环境配置问题

在学习DirectShow的过程中,发现在VS2010平台上程序总是运行出错,最后网上查找资料才发现时环境配置问题。

最后的解决方法是在下载安装DirectShow之后编译baseclasses项目,在C:

\ProgramFiles\MicrosoftSDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses选择不同的编译环境可以得到四个类型的strmbasd.lib,开发项目时选择相应版本的strmbasd.lib。

在编译的时候没错误提示,看来选择新版本还是有好处的。

在项目中包含include:

C:

\ProgramFiles\MicrosoftSDKs\Windows\v7.1\Include

C:

\ProgramFiles\Microsoft

SDKs\Windows\v7.1\Samples\multimedia\directshow\basecla

sses

以及lib:

C:

\ProgramFiles\MicrosoftSDKs\Windows\v7.1\Lib

C:

\ProgramFiles\MicrosoftSDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses\Debug(这个要根据所需要的strmbasd.lib版本进行选择)

3.声音滞后问题

在使用本程序进行视频聊天时,会感到对方说话的声音有些滞后。

这是因为音频采集设备默认情况下使用的采集缓存能够容纳500ms的数据。

只有采集满了500ms数据后,音频采集设备Filter才会送出一个Sample。

而视频采集以帧率25fps为例,视频采集设备Filter每输出一个Sample(也就是一帧图像)的时间间隔是40ms。

也就是说,音频数据要比视频数据迟送出来460ms。

于是,在远程端接收到数据后进行播放时,音视频不同步也就不奇怪了。

解决方法也很简单,只要在本地采集时减小音视频数据采集送出的时间差即可。

也就是在CAudioCaptureFilter2类中成功创建了音频采集设备Filter之后,随即调用CaudioCaptureFilter2:

:

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