精品毕业论文基于vc语音聊天系统的设计与开发_第1页
精品毕业论文基于vc语音聊天系统的设计与开发_第2页
精品毕业论文基于vc语音聊天系统的设计与开发_第3页
精品毕业论文基于vc语音聊天系统的设计与开发_第4页
精品毕业论文基于vc语音聊天系统的设计与开发_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘 要随着计算机网络技术的发展,各种各样基于网络的应用也随之诞生,比如基于互联网的信息发布,通信,数据共享等等。局域网的发展也同样迅速。很多政府机构,企业,学校,都是先以一个统一的局域网联结在一起,再分别接入INTERNET.因此基于局域网的即时通信工具,就这样应运而生了。所以本文提出了一个更加合理的设计,并在WINDOWS平台上加以了实现.在本实现内将客户端和服务端综合在一个程序之内,用多线程实现不同的并行任务。并进行了人性化的界面设计,使用起来更加简单方便,并且功能十分合理,又易于扩展以及个性化定制。本文通过局域网聊天系统来具体共享内存实现进程间的数据交换,利用windows消息机制实现进程间的同步,两种机制结合使用。关键词: 信息传输;网络编程;语音传输;多媒体;AbstractAlong with the high-speed development of the computer network technology, various of applications based on network was born, like information releasing, data sharing . The development of the LAN is the same fast. Some governments, enterprises and schools constitute a LAN first ,then join into INTERNET. So the instant messenger in LAN was borned. So I make a new design, and implement it on WINDOWS platform. In my implementation the client and the server were integrated in one program with multi thread mechanism. And had a good GUI,it was very easy to use it. And the function is very realizable. At last, it is also easy for expanding.Key words: Information transmission; Network programming; Voice transmission; Multimedia;目 录 摘要IIAbstractIII1绪论11.1 课题背景及意义:11.2 课题现状11.3开发平台与技术的选择及介绍21.3.1开发环境的介绍21.3.2 WINDOWS SOCKETS网络编程接口概述21.3.3 VC+6.0开发平台简介22需求分析及可行性研究32.1需求分析:32.1.1现状分析32.1.2功能要求32.1.3系统基本流程图42.1.4 性能要求42.1.5 测试环境规定42.2 可行性研究:42.2.1成本可行性分析42.2.2技术可行性分析43相关开发技术的原理性说明53.1 win32编程原理及MFC框架53.1.1 WIN32编程原理53.1.2 MFC框架63.2 TCP/IP 协议及WINDOWS SOCKETS网络编程接口73.2.1 TCP/IP协议简介73.2.2 WINDOWS SOCKETS网络编程接口概述84 总体设计104.1体系结构设计104.2 功能模块划分115 详细设计及编码实现125.1服务器和客户端功能的实现125.2 语音模块实现145.3本地扫描模块实现156系统功能的测试与分析186.1语音聊天程序使用介绍186.2测试与分析19结论20参考文献21致 谢221绪论1.1 课题背景及意义:随着全球信息化进程的不断发展,网络也在飞速发展。出于高效、快速地处理各种事务的目的,越来越多的企业在其内部使用局域网来进行工作。在内部局域网的帮助下,企业得以简化信息流程,提高信息交换的速度,从而提高工作效率。然而,随着企业规模的扩大,业务量的增加,在局域网上运行的应用越来越多,如知识库、网络会议、数据库应用和数据的同步与备份等,这些应用对局域网的信息吞吐、处理能力的要求也越来越高。这些在企业内部原有局域网设计之初未曾考虑到的新情况的出现使得局域网不堪重负,容易发生信息阻塞,此时,局域网不但不能提高生产效率,反而成为企业发展的瓶颈。 随着电子进一步发展,笔记本型、掌上型等微型计算机必将以更优的性能价格比受到人们的欢迎。那么要进行交流,语言、文字就是不可缺少的。如何进行网络间的语言文字交流以及直接的语言交流?通过对Visual C+和Windows网络编程技术的学习,本系统旨在开发出一个能够进行简单网络间语言文字交流的语音传输软件。 1.2 课题现状基于VC的语音聊天系统的即时通信工具,实际上是互联网即时通信工具的一个小规模版本,广域网上的即时通信工具,如今一般采用UDP或者 TCP协议体系来实现 ,开发技术已经比较成熟,比如较早的ICQ,MSN Messanger,Yahoo 通这些国外开发的产品,还有国产的有名的QQ,新浪UC,LAVA-LAVA等,这些工具统统都实现了广域网上的即时通信,尽管都是即时通信,实现了即时聊天,以及文件传输的主要功能,但是也各有各的特色,比如ICQ的巨大客户群,MSN的个性化表情,YAHOO通的易操作性等。而QQ也具有一个相当方便的屏幕截图功能,另外就是,所有上述软件都实现了网络即时的视频,语音聊天功能。这些软件,在使用方面各有特色,在实现方面也各有所长,但基于这些产品正在商业运营阶段,其实现方式属于商业机密,具体细节不可能得知,但是它在大的方面无非就是各种利用各种平台上的网络通信接口,建构基于下层TCP/IP,或者UDP/IP协议的软件产品。在局域网内,这些功能的实现跟广域网相比更加简单,因为局域网的网络结构本身比广域网要复杂,但是又可以借些理解网络协议,以及网络通信工具的实现原理,所以仍然极具研究价值。1.3开发平台与技术的选择及介绍1.3.1开发环境的介绍我所设计的是一个面向中小型机构内部通信需求的语音聊天软件,要在短时间内开发出来并且要满足客户要求,无论是硬件还是软件都要选择合适,要求如下:开发设备应该完备;开发机器的性能必须稳定;操作系统的选择必须恬当;开发出的程序可以在尽可能多的平台上运行;要求运行机配置尽可能低档。对此,我们选择的硬件环境和软件环境如下: (1) 硬件环境 开发该系统应尽可能采用高档的硬件。因此,在应用时应采用更好的配置。 处理器:Intel Pentium PIII或更高处理器。 内存:128MB或更高。 网络:局域网。 (2) 软件环境 选择好的操作系统和好的编程语言是系统优劣的关键,我们要求系统在尽可能多的环境下运行,故选择Windows XP平台,对于一些无法在98中运行的API函数,一律不采用,并采取优化的算法编写程序。因VC6.0具有友好的集成开发界面、面向对象的可视化开发模式、良好的数据库及多媒体应用支持以及高效的软件开发与程序运行,功能更大,开发效率更高,不仅是网络环境下的优秀前端开发语言和工具,也是服务器端Web编程的优秀工具。加之我本人对本系统的操作最为熟练,所以选择该平台为开发环境。 1.3.2 WINDOWS SOCKETS网络编程接口概述既然选定了Windows平台,而又要开发网络通信程序,所以可以选择Windows的Sockets编程接口,Windows Sockets是一套开放的、支持多种协议的Windows下的网络编程接口。现在的Winsock已经基本上实现了与协议无关,你可以使用Winsock来调用多种协议的功能,但较常使用的是TCP/IP协议。Winsockets无疑是我们进行网络编程的利器。1.3.3 VC+6.0开发平台简介开发平台我选用了VC6.0,因为一直以来都使用VC6进行学习,对这个IDE最为熟悉,再者VC同样是由微软开发的系统,与其操作系统,网络接口具有最为密切的契合优点,所以选择了VC6.0。2需求分析及可行性研究2.1需求分析:2.1.1现状分析随着现代计算机技术的不断发展,多媒体已经成为现代计算机不可缺少的功能,而计算机的音频、视频功能是其中最为重要的部分。它不仅表现在取代传统方式看电影、欣赏数字音乐上,而是随着网络的不断发展,网络聊天及资料共享或传输已经成为人们最重要的交流目的。计算机硬件的更新,特别是海量存储设备和大容量内存在PC机上的实现(普通用户PC硬盘可以达到TB,内存2/4G甚至更多)对音频媒体进行数字化处理早已经成为可能。现在,企业、机关、学校都建立起了局域网。虽然可以通过传统单一的文件共享的方式进行通讯,但单使用这种方式,非常不方便。在网上邻居(网络)里,只能看到机器名,用户较多时很难弄清楚对方是谁,也不知道对方机器里有什么资源可以共享。而文字聊天方式比较单一缺乏真实感,交流速度也直接取决于两个人中打字较慢人的速度,所以语音通信就有了必要。但是语音传输需要有很大的网络带宽,对于拨号上网用户,语音传输仍然是奢侈品,不过对于局域网和宽带用户来说,是很不错的选择,本系统就是研究的基于局域网的语音传输,并以语音聊天为例给出了实例。语音聊天方式一般有两种,一种是专门的语音聊天室,采用Web方式,B/S(Browser/Server结构,另外一中则是类似于QQ、MSN等聊天工具,采用C/S结构。本设计是采用的是后者。TCP/IP网络中两个进程间的相互作用的主机模拟的模式是客户机/服务器模式(Client/Server model)。该模式的建立基于以下两点:1、非对等作用;2、通信完全是异步的。客户机/服务器模式在操作过程中采取的是主动请示方式,首先服务器方要先启动,并根据请示提供相应服务。然后由客户机发起连接,并选择相应的服务。本系统初步实现的是点对点的传输,即能够实现两个人的语音聊天,并不能实现“聊天室”的功能。执行速度愉快越好。相应时间预设置为千分之一秒。2.1.2功能需求(1)用户端之间的信息发送,本程序需要实现的最基本的功能(2)在线用户点对点的语音聊天。(3)在C/S模式中,服务器与客户端是相互依赖的。在客户端启用以后,需要查看服务器端是否在线,服务器在线才能正常使用客户端,如果服务器不在线,则在检测一定次数以后自动退出客户端程序。在使用过程中,客户端在指定时间内未向服务器端发送信息的,服务器认为客户端下线;客户端在一定时间内未收到服务器端信息的,认为服务器已经下线,则提示用户并建议退出,在用户一定时间后没有退出的则自动关闭客户端程序。2.1.3系统基本流程图启动客户端 连接服务器 否 显示连接启动服务器等待客户请求处理用户数据 是否成功 成 功聊天 显示聊天信息图2-1 语音聊天工作流程图2.1.4 性能要求首先要求程序要完全可靠,可以应付种种由于系统问题产生的错误,比如初始网络失败,对方突然下线等。要求提前设想到类似的尽可能多的可能发生的事件,做出相应的应对措施,并向用户提交简单易懂清晰明白的提示信息。要求程序对所运行之系统的硬件条件要求尽可能低,运行时内存占用尽可能小,响应速度要尽可能快。并且不发生内存泄漏之类影响系统运行的错误事件。并且要求易于维护及扩展。所以应该采用模块化开发,各个模块之间不要有太多的联系,以免维护困难。2.1.5 测试环境规定在开发完成以后,自己进行一个全面的测试;然后再找老师同学帮忙测试,查找一些自己不能发现的Bug。2.2 可行性研究:2.2.1成本可行性分析因为本软件只做开发学习使用,所以暂且不考虑经济成本及盈利问题。2.2.2技术可行性分析首先我已经搭建好开发所需要的软硬件平台,并进行了合理而完善的需求分析,做好了充分的前期准备工作,其次因为本程序的平台将基于Windows,将要使用网络通信技术,而Windows有完善成熟的网络通信接口,以及与VC开发环境的严密契合能力,加之相类似的更大规模的INTERNET通信工具产品也已有例在先,所以这个程序的开发可行性在技术上是完全可行的。3相关开发技术的原理性说明3.1 win32编程原理及MFC框架3.1.1 WIN32编程原理所谓的Win32开发,就是在C+语言的层面上,直接使用Win32 API开发Windows应用程序或者系统程序。虽说现在直接用Win32 API开发应用程序的人已经不多了,但是深入理解Windows系统程序设计原理,仍然是成为Windows开发高手的良好途径。所谓的Win32,其实是一个API规范,与UNIX系统编程接口标准POSIX是相对应的。下面是进行直接的Win32 SDK方式编程的基本思路或者说是一个框架:一个Windows程序分为程序代码和UI(User Interface 用户接口)资源两大部份,两部份最后以RC编译程序整合为一个完整的EXE文件。所谓UI资源是指功能菜单、对话框、程序图标、光标形状等等东西。这些UI资源的实际内容(二进制代码)系借助各种工具产生,并以各种扩展名存在,如 .ico .bmp .cur等等。程序员必须在一个所谓的资源描述档(.rc )中描述它们。RC编译器( RC.EXE )读取RC 文件的描述后将所有UI资源文件集中制作出一个.RES 文件,再与程序代码结合在一起,这才是一个完整的 Windows可执行文件。与控制台程序相同的是,一个Win32程序也必须有一个程序入口点,但是在这儿它不再叫main(),而叫做WinMain(),当Windows的SHELL检测到用户欲执行一个.exe程序,就会调用加载器把程序进行加载,然后调用C startup code,后者再调用WinMain(),程序的执行就开始了,WinMain()函数的原型为:int CALLBACK WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow);下面程序必须进行必要的初始化工作产生窗口,第一步是注册一个窗口类:用API函数:RegisterClass(),而这个函数需要一个已经定义好的系统结构:WNDCLASS,这个结构里面定义了窗口的种种属性,需要自己定义,但是许多属性都有默认值。然后调用CreateWindow()函数来产生具有上述定义属性的已注册窗口,但是需要注意的是它只是生成窗口,但并不显示之,所以还需要调用一个函数ShowWindow()将它显示在屏幕上,做完这些初始化工作以后,系统将进入消息循环:while (GetMessage(&msg, NULL, 0, 0)TranslateMessage(&msg);DispatchMessage(&msg);当消息循环捕捉到消息以后将交由窗口函数WndProc()窗口函数进行相应的处理。这样,一个基于消息事件驱动的WIN32程序的雏形就建立了起来。3.1.2 MFC框架由上面的介绍可以看出,直接用API函数开发一个WIN32程序是相当麻烦的,有好多既定的重复性的工作要做,所以微软就用C+的类机制将绝大部分的API函数进行了封装,构成了类,并且将基本的流程也封装在类机制下面,大大简化了WIN32开的的复杂性,尤其是在开发比较大型程序的时候这个便宜性更会得以体现。它就是Microsoft Foundation Classes,简称为MFC,可以说它是VC开发环境的一个核心构件。MFC构架了一个庞大的类体系结构,在4.0时代就多达189个类,程序代码达252个文件,58个头文件,共10MB之多,MFC4.2时又多加了29个类,但是最为主干的是下面类结构示图所示的一些类: CObjectCWndCDocumentCwinThreadCcmdTarge图3-1 MFC类框架主体CObject 是 MFC 类库的根类。 MFC 类库包括: (1)CCmdTarget 类:是 CObject 类的子类,它是 MFC 库中所有具有消息映射属性的类的公共基类。它的子类有 CWinThread 类, CWnd 类、 CDocument 类,从 CCndTarget 类派生的类能在程序运行时动态创建对象,并处理命令消息。 (2)CWinThread 类:是 CCmdTarget 的子类。 CWinThread 是所有线程类的基类,封装了应用程序操作的多线程功能。应用程序类 CWinApp 是 CWinThread 的子类,封装了初始化、运行、终止应用程序的代码。 (3)CWnd 类:窗口类,是 CcmdTarget 类的子类,从 CWnd 派生的类可以拥有自己的窗口,并对它进行控制。窗口框架类 CFrameWnd 和 CView 类是 CWnd 的子类,前者创建和维护窗口的边框、菜单栏、工具栏、状态栏,负责显示和搜索用户命令,后者负责为文档提供一个或几个视图。视图的作用是为修改、查询文档等任务提供人机交互的界面。 (4)文档类 CDocument 类:是 CCmdTarget 类的子类,负责封装和维护文档。文档包括应用程序的工作成果或环境设置数据等,可以是程序需要保存的任何内容。 构建一个基于MFC框架的程序,可以使用MFC的向导程序,但首先要明白,一个基于MFC的程序可以有几种类型:基于单文档结构的程序,基于多文档结构的程序以及基于对话框的应用程序,不同类型的程序具有不同的程序属性。3.2 TCP/IP 协议及WINDOWS SOCKETS网络编程接口3.2.1 TCP/IP协议简介(1)TCP/IP协议通常包含了一系列与“TCP(传输控制协议)”和“IP(网际协议)”有联系的网络协议,它包括其它的协议,应用软件,甚至网络媒介。这些协议的示例是:UDP(User Datagram Protocol)协议、ICMP(Internet Control Message Protocol)协议、ARP(地址解析协议)和其他一些协议的协议组。应用的示例:telnet(远程登录)、ftp(文件传递协议)、http等。 (2)逻辑结构:Network ApplicationsUDPTCPIPARPENETEthernet Cable图3-2 逻辑结构这是TCP/IP协议的分层结构在互连网计算机上的表示,用互连网技术互相通信的每台计算机都有这样的分层结构。这样的分层结构决定了计算机在internet上互相通信的方式。数据通过这样的分层结构从上层传到底层,然后通过网线把数据传送出去。底层的水平线代表以太网网线,“O”代表收发器,“*”代表IP地址,“”代表网址,理解这样的分层结构是理解INTERNET技术的基础。(3)本论文涉及到的协议:IP、TCP IP(Internet Protocol)是TCP/IP的心脏,也是网络层中最重要的协议。 IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层-TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。 UDP(IP协议号17)是一个无连接的数据报协议。它是一个“best effort”或者“不可靠”协议不是因为它特别不可靠,而是因为它不检查数据包是否已经到达目的地,并且不保证它们按顺序到达。UDP的典型性应用是如流媒体(音频和视频等)这样按时到达比可靠性更重要的应用,或者如DNS查找这样的简单查询/响应应用,如果需要建立可靠的连结,哪么所作的额外工作将是不成比例地大。本程序只应用于局域网中,局域网中的数据流传输的可靠性高,故选择UDP协议。3.2.2 WINDOWS SOCKETS网络编程接口概述 在网络编程中最常用的方案便是Client/Server (客户机/服务器)模型。在这种方案中客户应用程序向服务器程序请求服务。一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户向这个服务的地址提出了连接请求。在这个时刻,服务程序被惊醒并且为客户提供服务对客户的请求作出适当的反应。为了方便这种Client/Server模型的网络编程,90年代初,由Microsoft联合了其他几家公司共同制定了一套WINDOWS下的网络编程接口,即Windows Sockets规范,它不是一种网络协议,而是一套开放的、支持多种协议的Windows下的网络编程接口。现在的Winsock已经基本上实现了与协议无关,你可以使用Winsock来调用多种协议的功能,但较常使用的是TCP/IP协议。Socket实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket接口的计算机通信。应用程序在网络上传输,接收的信息都通过这个Socket接口来实现。如下图所示:服务器方客户方socket(),建立流式套接字,返回套接字句柄sBind(),关联一个本地地址到套接字s。Listen(),设置backlog值,进入监听状态。Accepet(),等待接受客户连接请求。建立连接,accept函数返回,得到新的套接字,如CS。Recv()/send(),在套接字cs上收发数据,直到完成交换。Closesocket(),关闭套接字cs。Closesocket(),关闭监听套接字s,服务结束。Connect(),将套接字s与服务器连接。Recv(-)/send(),在套接字上收发数据,直到数据交换完。Closesocket(),关闭套接字s,结束TCP对话。socket(),建立流式套接字s。图3-3 面向连接的套接字的系统调用图4 总体设计4.1体系结构设计通常的通信工具,都采用客户机/服务器(C/S)体系结构,C/S结构是这样的一种结构:它包括一个客户机(或前端),一个服务器(或称后端),客户机的作用是访问和处理远程服务器上的数据,服务器的作用是接收和处理客户机的数据请求。有时,可能有多个客户向同一个服务器同时请求服务,这就需要服务器决定怎样处理这些请求。Client/Server结构是当前数据库应用程序中极为流行的一种方式。尤其是网络技术的发展,使得当前很多系统都采用这种方式进行构造,其最大的优点是将计算机工作任务分别由客户端和服务器端来共同完成,这样有利于充分合理的利用系统资源。另外它的服务器端还可以将信息集中起来,任何客户机都可以通过访问服务器而获得所需的信息。Client/Server模型最终可归结为一种“请求/应答”关系。一个请求总是首先被客户发出,然后服务器总是被动地接收请求,返回客户需要的结果。在客户发出一个请求之前,服务进程一直处于休眠状态。一个客户提出请求后,服务进程被“唤醒”并且为客户提供服务,对客户的请求做出所需要的应答。如下图所示:图4-1客户机服务器通信结构示图在客户端启动后,客户端计算得到本地网络的广播地址,进行广播查找服务器端,服务器接收到客户端的广播信息后返回服务器地址,则客户端接收、验证信息并记录服务器端地址,然后客户端启动定时期,定时发送信息到服务器,以告知服务器自己在线,然后服务器返回在线用户列表,服务器依靠客户端发送的信息来更新维护在线用户列表。在客户端与服务器尽心数据交换,拥有了在线用户列表后,就可以选择IP进行客户端之间的点对点信息交流了。如果服务器不在线,则客户端会提示用户退出,在一定的时间后自动退出。4.2 功能模块划分根据以上的系统需求分析,以及体系结构设计,可以对系统进行如下的功能模块划分如下图所示。客户端/服务器模块 本地扫描模块文字/语音聊天模块图4-2 功能模块图其中客户端/服务器模块完成对网络的初始化,然后启动两个子线程:服务端监听线程以及网络扫描模块线程,监听线程监听游客进入聊天室。然后由网络扫描模块得到当前的网络连接情况,确认哪些需要连接,哪些不需要。本地扫描模块主要负责收集本地IP,相应的服务器/客户端IP,开放的端口号,便于建立及时有效的连接。文字/语音聊天模块主要负责通信的建立,在由服务器提供的聊天室里文字聊天和语音聊天。本系统暂不能实现游客身份识别。只能在一起群聊。5 详细设计及编码实现5.1服务器和客户端功能的实现服务器端与客户端是程序与外界联系的窗口。其主要功能实现如下: if(sound!=NULL)STOPSOUND*stop=(STOPSOUND*)GetProcAddress(sound,SoundStop);stop();FreeLibrary(sound);SetDlgItemText(IDC_SOUND,开始语音聊天);issend=TRUE; /开始语音聊天/如果有声音过来并且本机的声音设备已经准备好了则首先在本机发出声音 m_sound.Play();/发出本地声音,并存储准备发送。CSingleLock lock(&m_mutex,TRUE);CMessg msg;msg.m_strText=;msg.m_tag=1;memcpy(msg.m_buffer,m_sound.m_cBufferIn,MAX_BUFFER_SIZE);if(m_willchating=TRUE)m_sound.Init(this);m_sound.Record();SetDlgItemText(IDC_NEWSEND,停止语音聊天);m_willchating=FALSE;/准备结束语音聊天。 if (m_aSessionOut != NULL) msg-Serialize(*m_aSessionOut); m_aSessionOut-Flush(); return TRUE; else /对方关闭了连接 int CClientSocket:GetLocalHostName(CString &sHostName)/获得本地计算机名称 /获取IPLPSTR lpAddr=lpHostEnt-h_addr_list0;if(lpAddr)struct in_addr inAddr;memmove(&inAddr,lpAddr,4);f0=inAddr.S_un.S_un_b.s_b1;f1=inAddr.S_un.S_un_b.s_b2;f2=inAddr.S_un.S_un_b.s_b3;f3=inAddr.S_un.S_un_b.s_b4;/获得本地IP struct in_addr inAddr;memmove(&inAddr,lpAddr,4);/转换为标准格式if(lpHostEnt=NULL)sIpAddress=_T();return GetLastError();/产生错误5.2 语音模块实现基本的音频数字化处理包括以下几种。1、不同采样率、频率、通道数之间的变换和转换。其中变换只是将其视为另外一种格式,而转换通过重新采样来进行,其中还可以根据需要采用插值算法以补偿失真。2、针对音频数据本身进行的各种变换,如淡入、淡出、音量调节等。3、通过数字滤波算法进行的变换,如高通、低通滤波器。但是最基本、最常用的还是声音的录制和播放。作为一个语音传输软件,声音的录制、保存、传输和播放都是必不可少的,也是最重要的一环。本软件需要语音输入、输出功能。这些技术的实现借助了Windows系统提供的底层音频API。MIDI的意思是乐器数字接口(Musical Instrument Digital Interface),它在微软公司开发Windows系统以前就有的一个用于电子键盘的标准。MIDI定义了一个传输和存储音乐信息的协议。它在多媒体音频中占有重要的位置,是播放和录制音乐的国际标准,它确定了连接音乐设备的电缆线、硬件和通信协议。下边将介绍程序的具体实现。对于录入和播放的声音存储时必须以特定的格式才可以,本软件的格式定义如下:m_soundFormat.wFormatTag=WAVE_FORMAT_PCM;m_soundFormat.nChannels=1;m_soundFormat.nSamplesPerSec=8000;m_soundFormat.nAvgBytesPerSec=16000;m_soundFormat.nBlockAlign=2;m_soundFormat.cbSize=0;m_soundFormat.wBitsPerSample=16;只定义了声音的格式是不够的,要实现声音的存储还得对数据块进行定义,数据块的定义采用如下结构描述:m_pWaveHdrIn0.lpData=m_cBufferIn;m_pWaveHdrIn0.dwBufferLength=MAX_BUFFER_SIZE;m_pWaveHdrIn0.dwBytesRecorded=0;m_pWaveHdrIn0.dwFlags=0;为了能够进行录制和播放,还需要利用低级音频函数wave系列函数。对于播放过程,需要利用waveOutPrepareHeader函数准备缓冲数据头信息,然后调用函数waveOutWrite将音频数据缓冲区中的数据写到播放设备中去进行播放。对于录制过程,需要先调用waveInPrepareHeader进行接收数据缓冲区的准备工作,然后调用waveInAddBuffer函数添加录制数据缓冲区,最后调用函数waveInStart进行录制。下边将列出这些函数在源程序中的应用:result=waveOutPrepareHeader(m_hWaveOut,&m_pWaveHdrOut0,sizeof(WAVEHDR); if (result!= MMSYSERR_NOERROR) AfxMessageBox(_T(Cannot OutPrepareHeader !); return; ;If以后为信息出错警告,以下函数省略。result=waveOutWrite(m_hWaveOut,&m_pWaveHdrOut0,sizeof(WAVEHDR); result=waveInPrepareHeader(m_hWaveIn,&m_pWaveHdrIn0,sizeof(WAVEHDR); result=waveInAddBuffer(m_hWaveIn,&m_pWaveHdrIn0,sizeof(WAVEHDR); void CSound:Record()waveInStart(m_hWaveIn);/开始录音5.3本地扫描模块实现int CClientSocket:GetLocalHostName(CString &sHostName)/获得本地计算机名称char szHostName256;int nRetCode;nRetCode=gethostname(szHostName,sizeof(szHostName);if(nRetCode!=0)/产生错误sHostName=_T(没有取得);return GetLastError();sHostName=szHostName;return 0;int CClientSocket:GetIpAddress(const CString &sHostName, CString &sIpAddress)/获得本地IPstruct hostent FAR * lpHostEnt=gethostbyname(sHostName);if(lpHostEnt=NULL)/产生错误sIpAddress=_T();return GetLastError();/获取IPLPSTR lpAddr=lpHostEnt-h_addr_list0;if(lpAddr)struct in_addr inAddr;memmove(&inAddr,lpAddr,4);/转换为标准格式sIpAddress=inet_ntoa(inAddr);if(sIpAddress.IsEmpty()sIpAddress=_T(没有取得);return 0;int CClientSocket:GetIpAddress(const CString &sHostName, BYTE &f0,BYTE &f1,BYTE &f2,BYTE &f3)/获得本地IPstruct hostent FAR * lpHostEnt=gethostbyname(sHostName);if(lpHostEnt=NULL)/产生错误f0=f1=f2=f3=0;return GetLastError();/获取IPLPSTR lpAddr=lpHostEnt-h_addr_list0;if(lpAddr)struct in_addr

温馨提示

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

评论

0/150

提交评论