毕业设计论文局域网聊天系统的设计与实现

上传人:痛*** 文档编号:72760766 上传时间:2022-04-09 格式:DOC 页数:38 大小:649.50KB
收藏 版权申诉 举报 下载
毕业设计论文局域网聊天系统的设计与实现_第1页
第1页 / 共38页
毕业设计论文局域网聊天系统的设计与实现_第2页
第2页 / 共38页
毕业设计论文局域网聊天系统的设计与实现_第3页
第3页 / 共38页
资源描述:

《毕业设计论文局域网聊天系统的设计与实现》由会员分享,可在线阅读,更多相关《毕业设计论文局域网聊天系统的设计与实现(38页珍藏版)》请在装配图网上搜索。

1、存档日期: 存档编号: 毕业设计报告题 目: 局域网聊天系统的设计与实现 子 课 题: 学 号: 姓 名: 院 系: 专业、年级、班组: 指 导 教 师: 毕业设计报告原创性声明局域网聊天系统的设计与实现摘 要:本文介绍了采用Microsoft Visual C+ 6.0编程开发视频聊天系统的一套比较常用的解决方案。文字聊天采用TCP模式;语音视频聊天采用UDP模式,在客户端之间点对点的进行。在该方案中,通过函数库VFW来实现视频捕获、影像压缩以及影像播放。微软公司提供的专门用于视频捕获开发的工具包VFW(Vedio For Windows),为在Windows操作系统中实现视频捕获提供了标准

2、的接口,从而大大降低了程序的开发难度。在视频传输方面,则通过组建视频帧,将位图形式的视频帧压缩成帧格式的Mpeg4流,传输到客户端后,解压并显示影像。同时,在本方案中,采用了线程来实现语音录制和语音回放,最终实现了通过服务器中转的文字聊天、点对点的语音视频聊天。关键词: 文字聊天;VFW;视频传输;语音回放 Design and Implementation of LAN-Based Chat Room SystemAbstract: As a new tool about communication, video chatting system has broken through geog

3、raphical restrictions, has provides more convenient, flexible and complete transmission and service. Furthermore, it has a very bright future. The common solution about how to develop a video chatting system is introduced by the Microsoft Visual C + + 6.0 programming. TCP model is used in the text c

4、hatting and UDP for the point-to-point video chats between the Clients. In this plan, Video Capture, Video Compression Manager and DrawDib are realized by the functions of VFW(Vedio For Windows) Library. The special kit VFW (Video for Windows) in video capture offered by Microsoft Corporation, has p

5、rovided a standard interface for video capture in Windows Operating System and thus greatly reduced the hardship of programming. In video transmission aspect, it requires a video frame which is compressed the video frame of bitmap into Mpeg4 steam of frame form. Then it will be decompressed into ima

6、ges since it has been arrived the Client. Meanwhile, the thread is used to achieve audio recording and replaying. Finally, it has realized the text chatting through a server to transit, the point-to-point audio and video chats.Keywords: text chatting; VFW; video transmission; audio playing目 录第1章 绪论1

7、1.1 课题背景及意义11.2 课题现状1第2章 开发技术的原理性说明22.1 Win32编程(即SDK程序设计原理)22.2 MFC (Microsoft Foundation Class)32.2.1 简介32.2.2 MFC与C 语言API 的关系32.2.3 MFC类库32.3 TCP/IP协议及WINDOWS SOCKETS 网络编程接口42.3.1 TCP/IP协议简介42.3.2 Windows Socket 网络编程简介42.4 多线程技术42.4.1 进程及线程概述42.4.2 MFC对多线程编程的支持52.5 VFW简介52.6 VC+ 6.0 简介8第3章 需求分析及可行

8、性研究93.1系统功能模块图93.2需求分析93.2.1 功能需求分析93.2.2 性能需求分析103.2.3 运行需求分析113.3可行性研究113.3.1 成本可行性113.3.2 技术可行性113.4软硬件环境113.5 界面的设计113.5.1 登陆界面113.5.2 服务端界面设计123.5.3 客户端界面设计12第4章 详细设计及编码实现144.1 文字聊天144.1.1 TCP套接字的运用144.1.2 文字聊天实现144.2 语音视频聊天174.2.1 UDP套接字的运用174.2.2 视频的捕捉184.2.4 视频捕获驱动224.2.5 语音录制224.2.6 语音回放234

9、.2.7 视音频的传输24第5章 测试265.1 测试265.2 测试结论26第6章 总结与展望276.1 总结276.2 展望27毕业设计体会28致谢29参考文献30英文翻译资料31第1章 绪论1.1课题背景及意义随着Internet的不断发展普及,网络通讯成为人们生活中的一部分。网络聊天已和手机等一样,成为人们运用最为广泛的通信工具之一。本设计主要目的是为了满足人们通讯交流的便捷,实现灵活、全面的音、视频信息的传递和服务。模拟QQ软件,开发一个多功能的聊天系统软件,本毕业设计主要实现语音视频聊天、文字聊天等功能。 本设计开发采用C/S结构,在VC开发环境下,使用C+编程语言进行本软件的开发

10、。在本文中,将讨论一种基于MFC Socket的局域网通信系统的设计与实现方法。 基于MFC Socket的局域网通信软件可以为局域网提供一种良好、安全、快速的通信机制,在局域网内部通信、教学、讨论等应用中都具有一定的实用价值,它同时很好地诠释了MFC Socket通信的原理。1.2 课题现状基于局域网的即时通信工具,实际上是互联网即时通信工具的一个小规模版本,广域网上的即时通信工具,如今一般采用UDP或者 TCP协议体系来实现,开发技术已经比较成熟,比如较早的Icq、MSN 、Yahoo!通等国外开发的产品,还有国产的有名的QQ、百度hi!,中国移动通信fetion等,这些工具统统都实现了广

11、域网上的即时通信。所有上述软件都实现了网络即时的文字,视频语音聊天功能。这些软件,在使用方面各有特色,在实现方面也各有所长,但由于这些产品正在商业运营阶段,其实现方式属于商业机密,具体细节不可能得知,但是它在大的方面无非就是各种利用各种平台上的网络通信接口,建构基于下层TCP/IP,或者UDP/IP协议的软件产品。在局域网内,这些功能的实现跟广域网相比更加简单,因为局域网的网络结构本身比广域网要简单,但是可以借此理解网络协议,以及网络通信工具的实现原理,所以仍然极具研究价值。第2章 开发技术的原理性说明2.1 Win32编程(即SDK程序设计原理)所谓的Win32开发,就是在C+语言的层面上,

12、直接使用Win32 API(Application Programming Interface:系统开放出来,给程序员使用的接口。)开发Windows应用程序或者系统程序。虽然现在直接用Win32 API开发应用程序的人已经不多了,但是深入理解Windows系统程序设计原理,仍然是成为Windows开发高手的良好途径。所谓的Win32,其实是一个API规范,与UNIX系统编程接口标准POSIX是相对应的。下面是进行直接的Win32 SDK方式编程的基本思路或者说是一个框架。一个Windows程序分为程序代码和UI(User Interface 用户界面)资源两大部分,两部分最后以RC编译程序编

13、译为一个完整的EXE文件。所谓UI资源是指功能菜单、对话框外貌、程序图标、光标形状等等。这些UI资源的实际内容(二进制代码)系借助各种工具产生,并以各种扩展名存在,如 .ico .bmp .cur等等。程序员必须在一个所谓的资源描述档(.rc )中描述它们。RC编译器( RC.EXE )读取RC 文件的描述后将所有UI资源文件集中制作出一个.Res资源文件,再与程序代码结合在一起,这才是一个完整的 Windows可执行文件。1.WinMain函数main()函数是C+程序的进入点,而WinMain函数则是Windows程序的进入点。2. Msg结构体定义了一个Msg结构体,是Windows内设

14、的一种数据格式, 在Windows程序中,消息是由MSG结构体来表示的。3. 注册窗口RegisterClass()完成注册窗口类的功能,设定窗口的属性:边框、颜色、标题、位置等等。4. 创建窗口CreateWindow函数可以用于创建父窗口、弹出窗口以及子窗口,在创建窗口时它可以确定窗口类、窗口标题、窗口风格、大小以及初始化位置。5. 显示窗口创建窗口后需要使用ShowWindow函数用于显示窗口。6、刷新窗口调用UpdateWindow函数来刷新窗口。7. 消息循环初始化工作完成后,WinMain进入所谓的消息循环,使用while循环,不断的GetMessage,再使用TranslateM

15、essage将消息转化,用DispatchMessage将消息传递给窗口函数去处理。8. 获取消息GetMessage功能函数从消息队列中获取消息,如果消息队列中没有消息,此功能函数则会一直等得消息。9. 转换消息将特定的消息转换为不同的消息,例如消息队列中同时有WM_KEYDOWN和WM_KEYUP消息时,意味着用户同时按下了键盘上的某几个键,此时TranslateMessage将其转换为一个WM_CHAR消息。10. 将消息发送到回调函数DispatchMessage通过USER模块的协助将消息送到该窗口的窗口函数去了,但是DispatchMessage并没有指定函数名,却可以将消息传送过

16、去,这是因为消息发生的时候,OS已经根据当时状态,为它标明了所属窗口,而窗口所属的窗口类亦是明确的。11. WinMain函数返回值return msg.wParam;/返回结构体变量msg中的wParam的值。12. WindowProc窗口函数窗口中的生命枢纽:窗口函数WindowProc。WindowProc是一个callback函数,常利用switch/case方式判断消息的种类,以决定处理方式。2.2 MFC (Microsoft Foundation Class) 2.2.1 简介MFC是在1992年随微软的Microsoft C/C+ 7.0编译器发布的,是建立在Windows

17、API之上的C+ 类库(C+ Class Library),意图是使Windows程序设计过程更有效率,更符合面向对象的精神。现在MFC已经成为了Windows环境上标准的C+ API。MFC使得开发Windows应用程序变得简单容易,将很多应用程序开发中常用的功能自动化,并且提供了文档框架视图结构和活动文档这样的便于自定义的应用程序框架。同时,在Visual C+内部也内建了很多对MFC的非常实用的东西,例如类向导这样的支持,减少软件开发的时间,使用类向导可以生成从hello world这样的简单程序到活动文档服务器这样的复杂程序。MFC的消息映射机制也避免了使用性能较低的庞大虚函数表。MF

18、C在整个Windows家族中都是兼容的。12.2.2 MFC与C 语言API 的关系设置Microsoft 基本类库与其它Windows 类库所不同的唯一特征就是它与C 语言编写的Windows API 的紧密的映射关系。而且,可以将直接调用Windows API 与调用类库自由地混合起来使用。这种直接访问并不意味着类可以完全取代API。开发者有时必须直接调用一些Windows函数,例如,SetCursor 和GetSystemMetrics。只有在有明显优势时,一个Windows 函数才被一个类成员函数所替代。2.2.3 MFC类库MFC类库是一个很大的、扩展了的C+类层次结构,与传统上使用

19、 C 语言直接访问 Windows API 相反,MFC已经包含和压缩了所有标准的“样板文件”代码,这些代码是所有用C编写的 Windows 程序所必需的,因此用 MFC 编写的程序要比用C 语言编写的程序小得多,当然MFC 所编写的程序的性能也毫无损失。必要时,也可以MFC可以用面向对象的方法来调用Windows API,因为 MFC 不修改也不隐藏 Windows 程序的基本结构。MFC 是很庞大的。例如,版本4.0 中包含了大约200个不同的类。事实上,你可能只需要使用其中的十多个不同的类,就可以建立一个非常漂亮的程序。MFC层次结构大约可分为几种不同的类型的类:1. 根类:Cobjec

20、tMicrosoft 基本类库中的大多数类都是由在类层次表中根上的唯一的一个基类派生而来的。2. MFC 应用结构类MFC 应用构造类有助于一个框架应用的构造。它们对大多数应用提供了通用功能。可以在框架中填写对于应用特定的功能。3. 窗口、对话和控件类类CWnd 和它的派生类封装了HWND,它是一个Windows 窗口。CWnd可被自己使用,也可以作为派生新类的基类。类库提供的派生类表示各种窗口。CWnd是所有窗口的基类。可以使用CWnd 派生出来的一个类,也可以从其中派生出自己的类。4. 绘画和打印类在Windows 中,所有的图形输出都是在一个可视的绘图区上。这叫作一个设备上下文(或DC)

21、。MFC 提供了封装不同DC 类型的类,也提供了对Windows 绘图工具,例如位图、刷子、调色板和笔的封装。5. 文件和数据库类这些类允许将信息存储在一个数据库或一个磁盘文件中。有两个数据库类的集合 DAO 和ODBC它们提供了相似的功能。6. Internet 和网络类这些类允许和其它使用ISAPI 的计算机或一个Windows Socket 交换信息。还有创建ISAPI 扩展DLL 的类的集合和操作Windows 套接字的类的集合。支持连接的类的分类:ISAPI 类、Windows 套接字类、Win32 Internet 类。7. 其它还有简单的数据类型类、OLE 类、调试和异常类、数组

22、列表和映射类。2.3 TCP/IP协议及WINDOWS SOCKETS 网络编程接口2.3.1 TCP/IP协议简介通常包含了一系列与“TCP(传输控制协议)”和“IP(网际协议)”有联系的网络协议,它包括其它的协议,应用软件,甚至网络媒介。这些协议的示例是:UDP(User Datagram Protocol)协议、ICMP(Internet Control Message Protocol)协议、ARP(地址解析协议)和其他一些协议的协议组。应用的示例:telnet(远程登录)、ftp(文件传递协议)、http等。这其中一些协议最早发源于美国国防部的ARPA网项目。2 2.3.2 Wind

23、ows Socket 网络编程简介Socket实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有 Socket接口的计算机通信。应用程序在网络上传输,接收的信息都通过这个Socket接口来实现。Windows Sockets 规范定义了一套开放的、支持多种协议的、 Windows 下的网络编程接口。它不仅包含了人们所熟悉的Berkeley Socket 风格的库函数,也包含了一组针对Windows 的扩展库函数,使得程序员能充分地利用Windows 消息驱动机制进行编程。现在的Windows Sockets已经基本上实现了与协议无关,你可以使用Windows Sockets来调用

24、多种协议的功能,但较常使用的是TCP/IP协议。32.4 多线程技术2.4.1 进程及线程概述进程和线程都是操作系统的概念。每个进程是由一个或多个线程、私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。进程是应用程序的执行实例。线程是进程内的执行路径,也是 Win32 安排的最小执行单元。线程包括堆栈、CPU 寄存器的状态和系统计划程序执行列表中的项。每一个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的,此线程终止时,进程也终止。用户可以根据需要在应用程序中创建其它线程,多个线

25、程并发地运行于同一个进程中,所有线程都在该进程的虚拟地址空间中,共同使用这些虚拟地址空间、全局变量和系统资源,但是必须使用信号灯或其他进程间的通信方法协调它们的工作。一般情况下进程中的每个线程都独立运行的,对进程中的其他线程一无所知,除非使这些线程相互可见。多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。要说明的一点是,目前大多数的计算机都是单处理器(CPU)的,为了运行所有这些线程,操作系统为每个独立线程安排一些CPU时间,操作系统以轮换方式向线程提供时间片,这就给人一种假象,好象这些线程都在同时运行。由此可见,如果两个非常活跃的线程为了抢夺对 CPU的控制权,在线程切换时会消耗

26、很多的CPU资源,反而会降低系统的性能。这一点在多线程编程时应该注意。2.4.2 MFC对多线程编程的支持Win32 SDK函数支持进行多线程的程序设计,并提供了操作系统原理中的各种同步、互斥和临界区等操作。Visual C+ 6.0中,使用MFC类库也实现了多线程的程序设计,使得多线程编程更加方便。CWinThread对象代表在一个应用程序内运行的线程。运行的主线程通常由CWinApp 的派生类提供;CWinApp由CWinThread派生。另外,CWinThread对象允许一给定的应用程序拥有多个线程。CWinThread支持两种线程类型:工作者线程和用户界面线程。工作者线程没有收发消息的

27、功能:例如,在电子表格应用程序中进行后台计算的线程。用户界面线程具有收发消息的功能,并处理从系统收到的消息。CWinApp及其派生类是用户界面线程的例子。其它用户界面线程也可由CWinThread 直接派生。CWinThread类的对象存在于线程的生存期。如果你希望改变这个特性,将m_bAutoDelete设为FALSE。要使你的代码和MFC是完全线程安全的,CWinThread类是完全必要的。框架使用的用来维护与线程相关的信息的线程局部数据由CWinThread 对象管理。由于依赖 CWinThread来处理线程局部数据,任何使用MFC 的线程必须由MFC创建。例如,由运行时函数_begin

28、threadex创建的线程不能使用任何MFC API。为了创建一个线程,调用AfxBeginThread函数。根据你需要工作者线程还是用户界面线程,有两种调用AfxBeginThread 的格式。如果你需要用户界面线程,则将指向你的CWinThread派生类的CRuntimeClass的指针传递给AfxBeginThread。如果你需要创建工作者线程,则将指向控制函数的指针和控制函数的参数传递给AfxBeginThread。对于工作者线程和用户界面线程,你可以指定可选的参数来修改优先级, 堆栈大小, 创建标志和安全属性。AfxBeginThread线程将返回指向新的CWinThread对象的指

29、针。与调用AfxBeginThread相反,你可以构造一个CWinThread派生类的对象,然后调用CreateThread。如果你需要在连续创建和终止线程的执行之间重复使用CWinThread对象,这种两步构造方法非常有用。创建线程也可以使用API函数:CreateThread函数完成。其它还有挂起线程、结束线程等函数,将不再一一详解。2.5 VFW简介VFW是Microsoft 1992年推出的关于数字视频的一个软件包,它能使应用程序数字化并播放从传统模拟视频源得到的视频剪辑。4VFW的一个关键思想是播放时不需要专用硬件。为了解决数字视频数据量大的问题,需要对数据进行压缩。它引进了一种叫A

30、VI的文件标准,该标准未规定如何对视频进行捕获、压缩及播放,仅规定视频和音频该如何存储在硬盘上,以及在AVI文件中交替存储视频帧和与之相匹配的音频数据。VFW给程序员提供VBX和AVICap窗口类的高级编程工具,使程序员能通过发送消息或设置属性来捕获、播放和编辑视频剪辑。用户不必专门安装VFW,在安装Windows时,安装程序会自动地安装配置视频所需的组件,如设备驱动程序、视频压缩程序等。VFW主要由以下六个模块组成:1. AVICAP.DLL:包含了执行视频捕获的函数,它给AVI文件、I/O和视频音频设备驱动程序提供一个高级接口;2. MSVIDEO.DLL:用一套特殊的DrawDib函数来

31、处理屏幕上的视频操作;3. MCIAVI.DRV:此驱动程序包括对VFW的MCI命令的解释器;4. AVIFILE.DLL:支持由标准多媒体I/O(mmio)函数提供的更高的命令来访问 AVI文件;5. 压缩管理器(ICM):管理用于视频压缩/解压缩的编解码器(CODEC);6. 音频压缩管理器ACM:提供与ICM相似的服务,不同的是它适于波形音频。Visual C+在支持VFW方面提供有vfw32.lib、msacm32.lib、winmm.lib等库。特别是它提供了功能强大、简单易行、类似于MCIWnd的窗口类AVICap。AVICap为应用程序提供了一个简单的、基于消息的接口,使之能访问

32、视频和波形音频硬件,并能在将视频流捕获到硬盘上的过程中进行控制。AVICap支持实时的视频流捕获和单帧捕获,并提供对视频源的控制。虽然MCI也提供数字视频服务,比如,它为显示AVI文件的视频提供了AVIVideo命令集,为视频叠加提供了overlay命令集,但这些命令主要是基于文件的操作,不能满足实时地直接从视频缓存中获取数据的要求。对于使用没有视频叠加能力的捕获卡的PC机来说,用MCI提供的命令集是无法捕获视频流的。而AVICap在捕获视频方面具有一定的优势,它能直接访问视频缓冲区,不需要生成中间文件,实时性很强,效率很高。同时,它也可将数字视频捕获到文件。在视频捕获之前需要创建一个捕获窗,

33、所有的捕获操作及其设置都以它为基础。用AVICap窗口类创建的窗口(通过capCreateCaptureWindow函数创建)被称为“捕获窗”,其窗口风格一般为WS_CHILD和WS_VISIBLE。实际上,捕获窗类似于标准控制(如按钮、列表框等)。捕获窗具有下列功能:1. 将视频流和音频流捕获到一个AVI文件中;2. 动态地同视频和音频输入器件连接或断开;3. 以Overlay或Preview模式对输入的视频流进行实时显示;4. 在捕获时可指定所用的文件名并能将捕获文件的内容拷贝到另一个文件;5. 设置捕获速率;6. 显示控制视频源、视频格式、视频压缩的对话框;7. 创建、保存或载入调色板;

34、8. 将图像和相关的调色板拷贝到剪贴板;9. 将捕获的一个单帧图像保存为DIB格式的文件。AVICap在显示视频时提供的两种模式:1. 预览(Preview)模式:该模式使用CPU资源,视频帧先从捕获硬件传到系统内存,接着采用GDI函数在捕获窗中显示。在物理上,这种模式需要通过VGA卡在监视器上显示。2. 叠加(Overlay)模式:该模式使用硬件叠加进行视频显示,叠加视频的显示不经过VGA卡,叠加视频的硬件将VGA的输出信号与其自身的输出信号合并,形成组合信号显示在计算机的监视器上。只有部分视频捕获卡才具有视频叠加能力。灵活编写AVICap提供的回调函数还可满足一些特殊需求。比如,将宏cap

35、CaptureSequenceNoFile同用capSetCallbackOnVideoStream登记的回调函数一起使用,可使应用程序直接使用视频和音频数据。在视频聊天的应用程序中可利用这一点来获得视频帧,回调函数将捕获的图像传到远端的计算机。应用程序可用捕获窗来登记回调函数(由用户编写,而由系统调用),以便在发生下列情况时,它能通知应用程序,作出相应的反应:捕获窗状态改变;出错;视频帧和音频缓存可以使用;在捕获过程中,其它应用程序处于让步(Yield)地位。视频捕获编程也要用到涉及视频捕获的结构、宏、消息和函数。令人高兴的是,发送AVICap窗口消息所能完成的功能都能调用相应的宏来完成。例

36、如,SendMessag(hWndCap,WM_CAP_DRIVER_CONNECT,0,0L)与capDriverConnect(hWndCap,0)的作用相同,都是将创建的捕获窗同视频输入器件连接起来。视频部分主要是利用Video Capture函数库来获取影像的。Video Capture主要提供下列功能:连接驱动程序;获取影像、声音资料,并显示在屏幕上或者是存成AVI文件;获取单张影像显示在屏幕上,拷贝至剪贴簿,或者是存成DIB(Device-Independent Bitmap)文件。Video Capture的主要结构:结构体CAPTUREPARAMS主要包含一些获取图像的参数:D

37、WORD dwRequestMicroSecPerFrame代表相邻两个frame的获取时间间隔;BOOL fYield值为TRUE,则表示Windows会以另一个thread来捕获影像,值为FALSE,程序会在捕捉影像后显示忙碌状态;BOOL fCaptureAudio其值表示是否需要同时获取声音资料。结构体BITMAPINFO和点阵图有关,主要定义了影像获取之后显示在屏幕上、存储在文件中的格式,它包含两个成员:BITMAPINFOHEADER bmiHeader描述影像性质的结构,其成员记载了影像的大小、颜色深度和压缩的方式,该成员在Video Capture、Video Compress

38、ion Manager和DrawDib函数库中,以及有关于点阵图的应用中;RGBQUAD bmiColors指向color table第一个元素的位置。结构体COMPVARS主要是记录所有和压缩相关的信息,重要的成员:DWORD fccHandler为compressor句柄;LPBITMAPINFO lpbiIn指向待压缩影像BITMAPINFO的指标;LPBITMAPINFO lpbitOut:指向压缩完影像BITMAPINFO的指标;LONG lKey代表key-frame rate,而所谓key frame是指此frame在解压缩时不需要依赖前面的frame;LONG lQ代表影像压缩

39、后的品质,取值为110000的整数。Video Compression Functions主要记录压缩功能相关的信息,其包含的比较重要的成员:ICLocate输入指向压缩前后BITMAPINFO的指标,以及欲使用的codecs;ICCompressorChoose呼叫一个系统内建的对话,其中包含所有可能使用的codes以及其相关参数;ICCompressQuery询问compressor是否支持某种压缩方式,输入参数为compressor handle及指向压缩前后BITMAPINFO的指标,此函数会传回询问结果;ICCompressBegin要求系统准备相关资源以供压缩之用;ICCompre

40、ss压缩某个frame;ICCompressEnd归还相关资源给系统;ICDompressQuery询问decompressor是否支持某种解压缩方式;ICDompressBegin要求系统准备相关资源以供解压缩之用;ICDompress解压缩某一个frame;ICDompressEnd归还相关资源给系统;ICDompressFree归还COMPVARS所占用的资源。2.6 VC+ 6.0 简介我们通常所说的Visual C+实际上是一个完善的、非常强大的C+程序开发环境,它的名字是 Microsoft Developer Studio 。二者之间的细小差别并不重要,通常这两个术语可以互换。但

41、如果你不围绕Developer Studio 来进行学习,就不能有效地使用Visual C+(Developer Studio 听起来很像Visual Studio , 但它们之间没有关系)。它包含:C+编译器、调试器、应用程序框架生成器、项目管理器、设计和实现菜单等资源的编辑器等等。第3章 需求分析及可行性研究3.1系统功能模块图图3.1 系统功能模块图3.2需求分析3.2.1 功能需求分析1. 文字聊天 文字聊天采用的是TCP模式,包括服务器端(server)和客户端(client)。首先启动服务器端,客户端通过用户名和密码登录服务器,服务器响应客户端登录并提示有用户登录,此时两个用户就可

42、以进行文字聊天,在文字聊天时信息通过服务器中转,而每个用户可以同时与多个用户进行文字聊天。当有用户退出时,服务器做出响应,提示在线用户,用户下线。文字聊天流程图如图3.2。图3.2 文字聊天流程图 2. 语音视频聊天语音视频聊天时采用的是UDP模式,客户端与客户端点对点的进行,不需要经过服务器端中转。在文字聊天的基础上,客户端之间自行处理的语音视频聊天,运用VFW函数库中的函数对USB口输入的数字视频信息进行相关处理,比如:视频捕获、影像压缩以及影像播放等,同时利用线程来处理声音部分的录制、回放等。A客户端向B客户端请求语音视频聊天是通过B客户端的用户名来获得B客户端的IP地址,并向B客户端发

43、送语音视频聊天请求,当B客户端接受后捕获视频,并进行压缩传输到A客户端解压并进行播放,在B客户端接受视频的同时,A客户端也捕获视频,压缩传输到B客户端解压并进行显示。语音视频聊天流程图如图3.3。图3.3 语音视频聊天流程图3.2.2 性能需求分析1. 可靠性高能在由于系统问题或其它原因产生错误后,作出相对应处理,比如网络初始化失败、服务器不在线等,可以提示用户安全退出本程序,在出现不可知的错误以后,可以尽量安全的退出程序。在程序的设计过程中,要求能尽可能多的设想到用户使用过程中可能发生的事件,并能在判断事件后做出相应的处理,使程序具有较高的容错性能。2. 宜操作性,程序简单易懂,用户能很容易

44、看懂并使用。3.2.3 运行需求分析1. 用户界面程序较小,启动速度快。启动后的应用界面要清爽,设计要简单明了,具有较高的易用性。 2. 故障处理在遇到可预知的故障与情况时,能提示用户并自动退出。在遇到不可预知的故障时能安全退出。3.3可行性研究3.3.1 成本可行性学习研究性开发,暂不考虑成本。3.3.2 技术可行性已有搭建好的基于Windows的软硬件平台,本人对VC开发环境有一定的了解,需继续深入学习VC和Windows socket 编程。3.4软硬件环境硬件环境: 计算机两台,如下:CPU:Intel Pentium或者 Pentium4 1GHz内存:256MB以上硬盘:20GB以

45、上其它:分别配有摄像头、麦克风、音响或者耳机等外部设备软件环境: Windows XP操作系统Microsoft Visual Stdio 6.0 3.5 界面的设计3.5.1 登陆界面图3.4 服务器登录界面图3.5 客户端登录界面3.5.2 服务器端界面设计图3.6 服务器端界面设计3.5.3 客户端界面设计图3.7 客户端界面设计第4章 详细设计及编码实现4.1 文字聊天4.1.1 TCP套接字的运用在文字聊天时,服务器端与客户端的连接是采用的TCP套接节进行连接。TCP套接字的使用如图4.1。创建CSocket对象CSocketServer来处理服务器端与客户端的连接,CSocket继

46、承于CasyncSocket,是Windows Socket API的高层抽象。CSocket通常和CsocketFile以及Carchive类混合使用,这两个类负责数据的发送和接收。要使用CSocket对象,首先要调用构造函数,然后调用Create函数创建一个Socket句柄。CSocket函数缺省是创建一个流Socket;如果没有使用CArchive类,那么还可以创建一个数据报Socket。服务器端调用Accept,客户端调用Connect,然后创建一个CsocketFile去关联CSocket。接下来的操作可以创建CArchive对象关联CsocketFile,以用来发送和接收数据。图4

47、.1 TCP套接字的使用4.1.2 文字聊天实现ChatServer服务器运行时,利用一个CSocket对象CSocketServer启动服务器,用函数gethostname来获得服务器端主机名和IP,同时在服务器对话框中显示服务器IP,并将分配的固定端口号8123显示在对话框中。用一个list列表显示在线用户,随时更新用户登录情况,用一个edit box显示客户端的聊天内容以及系统提示消息。每一个ChatClient客户端启动时,利用服务器内定的用户号和密码来登录(如图4.2)。在整个系统中,利用链表来处理所有的用户信息:当有用户登录时,在链表尾部加入该用户信息;当用户下线时,在该链表中删除

48、用户,并提示所有用户,该用户下线。在对链表进行操作的同时,要更新list列表中的信息。图4.2 用户登录界面ChatServer服务器端响应客户端文字聊天时的中转情况如图4.3。图4.3 服务器响应文字聊天信息中转ChatClient客户端两两间进行文字聊天时,发送信息的处理函数如下:void CChatClientDlg:OnChatBtSend() /发送信息按键if( !m_bConnect)SetMessageBox(请连接服务器!rn);return ;CString str;CString szUserName;CMesg msg;GetDlgItemText(IDC_MESSAG

49、E,str);GetDlgItemText(IDC_USERNAME,szUserName);if( str.GetLength() = 0 )SetMessageBox(请输入想要发送的信息!rn);return ;if ( szUserName.GetLength() SendM(&msg);AddReceiver(szUserName , true);AddChatMessage(str);在聊天两个客户端的信息情况如图4.4和图4.5。图4.4 接收文字信息图4.5 发送文字信息4.2 语音视频聊天4.2.1 UDP套接字的运用在实现语音视频聊天时,采用的是基于UDP套接字的点对点模式

50、,而UDP面向的是无连接的数据服务,其套接字的使用如下图4.6所示。图4.6 UDP套接字的使用4.2.2 视频的捕捉利用VFW接口,视频捕获可以分为以下几个步骤:1. 建立视频采集窗口:该窗口用来接收视频捕捉驱动程序传来的数据和消息。2. 连接视频驱动程序:将建立的视频捕捉窗口与视频设备驱动程序相连。3. 视频捕获初始化。4. 视频捕捉设置:VFW下视频捕捉参数的设置可以通过调用函数或弹出对话框的形式来实现。一般视频驱动程序允许设置的参数包括视频源选择、视频格式、视频显示格式等。5. 设置回调函数:通过回调函数来通知程序视频事件的发生,比如捕捉一帧图像成功的消息,捕捉出错的消息等。6. 结束

51、捕捉:结束捕捉是应该有一些清除工作。如释放分配的内存,断开捕捉窗口与视频捕捉驱动程序的连接,清除视频捕捉窗口等。窗口类为捕获数字视频流及其相关操作提供了很大的方便,灵活编写其中的回调函数可满足实时视频传输的需要,例如应用程序可直接从缓冲中取得数字视频并对其进行压缩编码后实时地传到远端的客户端。在VC+中,采用VFW技术,客户端通过capSetCallbackOnFrame()注册回调函数,当采集卡采集到一幅图像后,系统就会自动调用回调函数,然后再回调函数中使用ICSeqCompressFrame()函数进行压缩。然后再通过Winsock将压缩后的数据发送到另一客户端。该客户端接收完一帧以后,交

52、给ICDecompress()解压,最后用SetDIBitsToDevice()将图像显示出来。基本的捕获设置包括设置捕获速度(每秒捕获多少帧)、是否同时捕获声频、捕获缓冲、允许最大丢失多少帧和是否使用DOS内存,以及使用键盘的哪个键或鼠标的哪个键来终止捕获等内容,这些设置使用CAPTUREPARAMS结构来描述,capCaptureGetSetup宏来得到当前的设置,然后改变此结构的成员变量,再使用capCaptureSetSetup宏设置新的设置。设置捕获速度,通过使用capCaptureGetSetup宏来得到当前的捕捉速度,将当前的捕捉速度保存在CAPTUREPARAMS结构的dwRe

53、questMicroSecPerFrame成员变量中,也可以通过设置此变量来改变当前设置值。设置终止捕获,同样通过使用capCaptureGetSetup宏来得到当前的设置,当前按键设置保存在CAPTUREPARAMS结构的vKeyAbort成员中,鼠标设置保存在fAbortLeftMouse和fAbortRightMouse成员中,通过修改可以设置新的热健或者鼠标左右键,修改完成后,使用capCaptureSetSetup宏来进行更新。捕获的时间限制,用CAPTUREPARAMS结构中的fLimitEnabled表示捕获是否有时间的限制,wTimeLimit用来设置指示捕获最大的持续时间,其

54、单位为秒。使用capCaptureGetSetup宏来得到当前的设置值。下面程序为设置CAPTUREPARAMS结构的实现代码:BOOL VideoCapture:SetCapturePara()CAPTUREPARMS CapParms=0;capCaptureGetSetup(m_capwnd,&CapParms,sizeof(CapParms);/得到当前的捕获速度CapParms.fAbortLeftMouse = FALSE;CapParms.fAbortRightMouse = FALSE;CapParms.fYield = TRUE;CapParms.fCaptureAudio

55、= FALSE;CapParms.wPercentDropForError = 80;if(!capCaptureSetSetup(m_capwnd,&CapParms,sizeof(CapParms)/log.WriteString(n Failed to set the capture parameters );return FALSE;/ Set Video Format capGetVideoFormat(m_capwnd,&m_bmpinfo,sizeof(m_bmpinfo);m_bmpinfo.bmiHeader.biWidth=IMAGE_WIDTH;m_bmpinfo.bmi

56、Header.biHeight=IMAGE_HEIGHT;BOOL ret=capSetVideoFormat(m_capwnd,&m_bmpinfo,sizeof(m_bmpinfo);/log.WriteString(n Video parameters set properly);return ret;/终止一个捕获任务BOOL VideoCapture:StopCapture()capCaptureStop(m_capwnd);capCaptureAbort(m_capwnd);Sleep(500); return TRUE;4.2.3 捕捉窗口在捕获前必须创建一个捕获窗口(Captu

57、re Widnow),下面介绍有关捕获窗口的情况:创建一个AVICap捕获窗口,用capCreateCaptureWindow函数并返回一个句柄。将捕获窗口连接至捕获设备,用capDriverConnect函数来使一个捕获窗口与一个捕获设备连接或关联连接上后,就可以通过捕获窗口向捕获设备发送各种消息,可以使用函数capGetDriverDescription来获得已安装的捕获设备名称及版本,将其列举在实现程序过程中。再利用capDriverGetName函数来得到捕获设备的名称将获得的版本发送到capDriverGetVersion。如果断开捕获窗口与捕获设备的连接用capDriverDisc

58、onnect。捕获窗口的状态,用capGetStatus函数来获得当前捕获窗口的状态,得到一个CAPSTATUS结构的拷贝。该结构的内容包含了图片的尺寸、卷轴的当前位置、overlay和preview是否已设置。由于其信息是动态的,每当捕获的视频流的尺寸发生改变,程序应该在获取捕获设备的视频格式以后及时进行刷新。而捕获窗口尺寸的改变并不影响实际的捕获视频流的尺寸。该尺寸由视频捕获设备的格式和视频对话框决定。/捕获窗口BOOL VideoCapture:Initialize() char devname128=0,devversion128=0; int index=0; BOOL ret =

59、TRUE, ret1 = TRUE, ret2 = TRUE, ret3 = TRUE; TRACE(VideoCapture:Initializen); /创建一个AVICap捕获窗口 m_capwnd = capCreateCaptureWindow(Capture,WS_POPUP,0,0,1,1,0,0);if(!m_capwnd)return FALSE;/connect callback functionsret = capSetUserData(m_capwnd,this);/Change destroy functions also. ret1 = capSetCallback

60、OnVideoStream(m_capwnd,OnCaptureVideo); /得到已安装的捕获设备的名称及版本 ret2 = capGetDriverDescription(index,devname,100,devversion,100);/ Connect to webcam driver/使一个捕获窗口与一个捕获设备连接或关联ret3 = capDriverConnect(m_capwnd,index);if(!(ret & ret1 & ret2 & ret3)/ Device may be open already or it may not have been/ closed

61、properly last time.AfxMessageBox(Unable to open Video Capture Device);/log.WriteString(n Unable to connect driver to the window);m_capwnd=NULL;return FALSE;/ Set the capture parametersif(SetCapturePara()=FALSE)/ log.WriteString(n Setting capture parameters failed); capDriverDisconnect(m_capwnd); /使捕获窗口与一个捕获设备断开 return FALSE;return TRUE;4.2.4 视频捕获驱动视频捕获必须具有视频捕获驱动才能进行,其相关内容如下:视频捕获驱动的性能,capDriverGetCap函数得到当前连接视频驱动的硬件性能

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!