




已阅读5页,还剩36页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
武汉工程大学 计算机科学与工程学院综合设计报告设计名称: 智能系统应用综合设计 设计题目: 音频网络传输的实现 学生学号: 0905030211 专业班级: 09智能2班 学生姓名: 柯力 学生成绩: 指导教师(职称): 鲁统伟(讲师) 课题工作时间: 2013. 1. 7 至 2013. 1. 18 说明:1、报告中的第一、二、三项由指导教师在综合设计开始前填写并发给每个学生;四、五两项(中英文摘要)由学生在完成综合设计后填写。2、学生成绩由指导教师根据学生的设计情况给出各项分值及总评成绩。3、指导教师评语一栏由指导教师就学生在整个设计期间的平时表现、设计完成情况、报告的质量及答辩情况,给出客观、全面的评价。4、所有学生必须参加综合设计的答辩环节,凡不参加答辩者,其成绩一律按不及格处理。答辩小组成员应由2人及以上教师组成。 5、报告正文字数一般应不少于5000字,也可由指导教师根据本门综合设计的情况另行规定。6、平时表现成绩低于6分的学生,取消答辩资格,其本项综合设计成绩按不及格处理。7、此表格式为武汉工程大学计算机科学与工程学院提供的基本格式(适用于学院各类综合设计),各教研室可根据本门综合设计的特点及内容做适当的调整,并上报学院批准。成绩评定表学生姓名: 柯力 学号: 0905030211 班级: 智能02 类别合计分值各项分值评分标准实际得分合计得分备注平时表现1010按时参加综合设计,无旷课、迟到、早退、违反实验室纪律等情况。由设计负责人给出完成情况3020按设计任务书的要求完成了全部任务,能完整演示其设计内容,符合要求。10能对其设计内容进行详细、完整的介绍,并能就指导教师提出的问题进行正确的回答。报告质量3510报告文字通顺,内容翔实,论述充分、完整,立论正确,结构严谨合理;报告字数符合相关要求,工整规范,整齐划一。5课题背景介绍清楚,综述分析充分。5设计方案合理、可行,论证严谨,逻辑性强,具有说服力。5符号统一;图表完备、符合规范要求。5能对整个设计过程进行全面的总结,得出有价值的结论或结果。5参考文献数量在3篇以上,格式符合要求,在正文中正确引用。答辩情况2510在规定时间内能就所设计的内容进行阐述,言简意明,重点突出,论点正确,条理清晰。15在规定时间内能准确、完整、流利地回答教师所提出的问题。总评成绩: 分 补充说明: 指导教师: (签字)日 期: 年 月 日答辩记录表学生姓名: 柯力 学号: 0905030211 班级: 智能02 答辩地点: 答辩内容记录:答辩成绩合计分值各项分值评分标准实际得分合计得分备注2510在规定时间内能就所设计的内容进行阐述,言简意明,重点突出,论点正确,条理清晰。15在规定时间内能准确、完整、流利地回答教师所提出的问题。答辩小组成员(签字): 年 月 日指导教师评语指导教师: (签字)日 期: 年 月 日一、综合设计目的、条件、任务和内容要求:1、设计目的随着计算机技术、网络技术、视频压缩编码技术等关健术的飞速发展,特别是Internet的迅速普及,网络音频传输系统得到越来越广泛的应用。用VC+实现从压缩、组帧、发送到接收、解压整个音频传输流程以及传输控制策略,达到高质量的实时音频传输的目的。2、设计条件 VC+6.0, openCV3、设计任务实现局域网高质量的实时音频传输。4、设计内容实现服务端音频捕获或播放,音频压缩、组帧、发送的功能;实现客户端音频接收、解压,播放的功能。 指导教师签字: 年 月 日二、进度安排:2013-1-7 查阅资料2013-1-8 2013-1-9 设计规划及原理分析2013-1-10 2013-1-17 设计实现音频网络传输2013-1-18 答辩三、应收集资料及主要参考文献:1陈坚,陈伟Visual C+网络高级编程M北京:人民邮电出版社,20012曹衍龙,刘海英Visual C+网络通信编程实用案例精选M北京:人民邮电出版社,20063曹章元,刘加明Visual C+60类库大全M北京:电子工业出版社,19994求是科技Visual C+音视频编解码技术及实践M北京:人民邮电出版社,20065美JAMSA KrisCC+c*程序员实用大全M北京:中国水利水电出版社,20026美KRUGLINSKI David JVisual C+技术内幕M4版北京:清华大学出版社,20017王华,叶爱亮Visual C+60编程实例与技巧FM北京:机械工业出版社,19998陈坚实用Visual C+编程大全FM西安:西安电子科技大学出版社,20009王士元C高级实用程序设计M北京:清华大学出版社,1999四、综合设计(课程设计)摘要(中文):计算机网络的飞速发展,给传统音频传输领域带米了极大的冲击并且为基于网络的视、音频通信提供了可能,在很多的网络通信中,都需要将某一发送端的话音实时的传榆给接收端。VC下的Clientserver体系为这些应用需求提供了一个不错的解决方案。实时语音组播系统可以分成发送端、接收端和网络传输3个子系统在此从TCPIP通信的原理,包括路由选择、传输协议、编程实现等角度。给出了比较完善的解决方案,从而实现了在局域网内语音信号的实时传输,有很好的参考意义和实用价值。关键词 局域网;实时语音;TCPIP;组播;音频捕捉五、综合设计(课程设计)Abstract(英文):The development of computer networks had brought great impact on the traditional audio and provided a possibility for video and audio communication based on networkIn the network communication,some voice from sending termination should be transmitted to the receiving termination realtimelyClient and Server system under VC platform provided a good solution for the applications,which included three systems such as sending termination,receiving termination and network transmissionAccording to the principle of TCPIP,route selection,transfer protocol,program implementation and so on.a perfect solution is proposed in this paper for realizing real-time transmission of voice signal within LANIt has good reference and utility valueKeywords:LAN;real-time voice; TCPIP ;multieast; voice catch武汉工程大学计算机科学与工程学院 综合设计报告目录摘 要IIAbstractII第一章 课题背景.11.1 音频传输背景11.2 音频处理简介11.3 socket简介.3第二章 设计简介及设计方案论述.42.1 设计简介42.2 设计方案42.3 界面设计7第三章 详细设计.113.1 音频处理.113.2 音频在局域网中的传输.14第四章 设计结果及分析.234.1 设计结果.234.2 错误分析.25总 结27致 谢28参考文献.29摘 要计算机网络的飞速发展,给传统音频传输领域带米了极大的冲击并且为基于网络的视、音频通信提供了可能,在很多的网络通信中,都需要将某一发送端的话音实时的传榆给接收端。VC下的Clientserver体系为这些应用需求提供了一个不错的解决方案。实时语音组播系统可以分成发送端、接收端和网络传输3个子系统在此从TCPIP通信的原理,包括路由选择、传输协议、编程实现等角度。给出了比较完善的解决方案,从而实现了在局域网内语音信号的实时传输,有很好的参考意义和实用价值。关键词 局域网;实时语音;TCPIP;组播;音频捕捉AbstractThe development of computer networks had brought great impact on the traditional audio and provided a possibility for video and audio communication based on networkIn the network communication,some voice from sending termination should be transmitted to the receiving termination realtimelyClient and Server system under VC platform provided a good solution for the applications,which included three systems such as sending termination,receiving termination and network transmissionAccording to the principle of TCPIP,route selection,transfer protocol,program implementation and so on.a perfect solution is proposed in this paper for realizing real-time transmission of voice signal within LANIt has good reference and utility valueKeywords:LAN;real-time voice; TCPIP ;multieast; voice catch- 29 -第一章 课题背景1.1 音频传输背景计算机网络的飞速发展,给传统音频传输领域带米了极大的冲击。鉴于传统音频传输中难以克服的诸如不便于管理、布线复杂、难于实现自动切换等等的缺点,数字网络易管理、败控、强大的数据传输能力无疑为未来传统音频传输指明了方向。目前以太网是计算机局域网络的主流技术,其应用已遍及各个方面,每幢智能大厦都具备连通互连网物理层布线。与专业音频数字网络技术比较,以太网具有成熟的技术标准,以及极高的性能价格比。应用以太网构成音频数字网络,将具有快速、廉价和方便等诸多优点,是近几年来各大专业音频设备研发公司研究的热点。音频传输的实时性要求是基于以太网来构筑传输系统首先必须考虑和解决的问题。同时,这样一个分布式系统内部的时钟同步十分关键,否则时序逻辑将可能发生意想不到的混乱。本综合设计根据音频传输网络的要求,结合传统以太网技术,研究了以太网的控制实时调度、系统时钟同步和系统设计等技术问题,分析了音频传输网络的协议设计,提出了理想的基于以太网的音频实时传输系统的解决方案。1.2 音频处理简介一、音频媒体的数字化处理随着计算机技术的发展,特别是海量存储设备和大容量内存在PC机上的实现,对音频媒体进行数字化处理便成为可能。数字化处理的核心是对音频信息的采样,通过对采集到的样本进行加工,达成各种效果,这是音频媒体数字化处理的基本含义。二、音频媒体的基本处理基本的音频数字化处理包括以下几种: 不同采样率、频率、通道数之间的变换和转换。其中变换只是简单地将其视为另一种格式,而转换通过重采样来进行,其中还可以根据需要采用插值算法以补偿失真。 针对音频数据本身进行的各种变换,如淡入、淡出、音量调节等。 通过数字滤波算法进行的变换,如高通、低通滤波器。三、音频媒体的三维化处理长期以来,计算机的研究者们一直低估了声音对人类在信息处理中的作用。当虚拟技术不断发展之时,人们就不再满足单调平面的声音,而更催向于具有空间感的三维声音效果。听觉通道可以与视觉通道同时工作,所以声音的三维化处理不仅可以表达出声音的空间信息,而且与视觉信息的多通道的结合可以创造出极为逼真的虚拟空间,这在未来的多媒体系统中是极为重要的。这也是在媒体处理方面的重要措施。 人类感知声源的位置的最基本的理论是双工理论,这种理论基于两种因素:两耳间声音的到达时间差和两耳间声音的强度差。时间差是由于距离的原因造成,当声音从正面传来,距离相等,所以没有时间差,但若偏右三度则到达右耳的时间就要比左耳约少三十微秒,而正是这三十微秒,使得我们辨别出了声源的位置。强度差是由于信号的衰减造成,信号的衰减是因为距离而自然产生的,或是因为人的头部遮挡,使声音衰减,产生了强度的差别,使得靠近声源一侧的耳朵听到的声音强度要大于另一耳。 基于双工理论,同样地,只要把一个普通的双声道音频在两个声道之间进行相互混合,便可以使普通双声道声音听起来具有三维音场的效果。这涉及到以下有关音场的两个概念:音场的宽度和深度。 音场的宽度利用时间差的原理完成,由于现在是对普通立体声音频进行扩展,所以音源的位置始终在音场的中间不变,这样就简化了我们的工作。要处理的就只有把两个声道的声音进行适当的延时和强度减弱后相互混合。由于这样的扩展是有局限性的,即延时不能太长,否则就会变为回音。 音场的深度利用强度差的原理完成,具体的表现形式是回声音场越深,则回音的延时就越长所以在回音的设置中应至少提供三个参数:回音的衰减率、回音的深度和回音之间的延时。同时,还应该提供用于设置另一通道混进来的声音深度的多少的选项。1.3 socket简介 本次综合设计运用的网络传输的核心方式就是socket。所谓socket通常也称作套接字,应用程序通常通过套接字向网络发出请求或者应答网络请求。以J2SDK-1.3为例,Socket和ServerSocket类库位于java .net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。Socket为了建立Socket,程序可以调用Socket函数,该函数返回一个类似于文件描述符的句柄。socket函数原型为:int socket(int domain,int type,int protocol);domain指明所使用的协议族,通常为PF_INET,(其与addrinfo 里的 AF_INET在现在看来是相同的。只是历史上人们曾构想将AF(地址家族address family)与PF(protocol family 协议家族)分开,但实际上这种区分并未真正推广,所以现在AF_INET和PF_INET具有相同的意义。其中AF_INET是基于IPv4而PF_INET基于IPv6)表示互联网协议族(TCP/IP协议族);type参数指定socket的类型:SOCK_STREAM 或SOCK_DGRAM,Socket接口还定义了原始Socket(SOCK_RAW),允许程序使用低层协议;protocol通常赋值0。Socket()调用返回一个整型socket描述符,你可以在后面的调用使用它。Socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用Socket函数时,socket执行体将建立一个Socket,实际上建立一个Socket意味着为一个Socket数据结构分配存储空间。Socket执行体为你管理描述符表。两个网络程序之间的一个网络连接包括五种信息:通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。Socket数据结构中包含这五种信息。socket在测量软件中的使用也很广泛。第二章 设计简介及设计方案论述2.1 设计简介要实现局域网音频数据传输,必须要解决两个间题:第一个问题是语音的录制和播放,即将一个用户所讲的语音信号录制下来,等待传输; 同时将从网络上接收到其它用户所发来的语音信息进行还原,使本地用户听到声音; 对于声音信息的录制和播放,在这里采用的是低层音频函数主要是考虑到语音信息传输的实时性要求。如果采用的是媒休控制接口函数(MCI ) ,在进行录制时首先将录制的信息保存在计算机的硬盘文件上,而数据发送时则需要将文件从硬盘读到缓冲区中,由此而导致数据在接收方有较大的延迟而低层音频函数,由于它提供了对计算机缓冲区的直接操作,使得录制的音频信息在缓冲区中就可以发送,不必先保存在文件中,这样就可以保证接收方无延迟地接收到发送方所发送的数据(所谓的无延迟指接收方感觉不出声音滞后)。因此只能选择较为低层的音频函数,虽然这种方法编程较为复杂,但却较好地保证了一说“与“听”是同时进行的第几个问题是数据在局域网内的传输,这是个网络数据传输的问题。实现网络信息的互通,MFC 中提供了封装的CAsyncSocket 类,可以方便地派生出符合要求的接收发送类。2.2 设计方案系统的应用平台是Windows操作系统,使用的是Winsock2规范,系统的开发工具是Microsoft VisualC+60。此次设计的软件,对组播组的成员,分为Server和Client 2种。进行通信之前,Server和Client都必须先加入一个组播组。除了服务器端和用户端以外,对于音频的处理也很重要。下面将设计方案分为三部分来进行介绍。2.2.1 音频处理方案在Windows系列操作系统中,Microsoft提供了强大的DirectX工具。其中的DirectSound技术可以实现对声音的实时捕捉和播放。1播放功能概述DirectSound缓冲区对象表示一个包含声音数据的缓冲区,这些数据以PCM格式被存储。该对象不仅可以用于开始、停止或暂停声音的播放,还能够设置声音数据中诸如频率和格式等属性。2音频捕获Directsoundcapture对象可以查询音频捕获设备的性能,并为从输入源捕获音频而创建缓冲区,它还能够捕获压缩格式的音频。DirectsoundcaptureBuffer对象表示一个用于捕获音频的缓冲区它可以循环利用。3播放声音的过程(1)锁定(IdirectsoundBuffer:Lock)从缓冲区的一部分;(2)写数据:将捕捉到的声音数据写入将要发送的数据包中;(3)解锁(1directSoundBuffer:Unlock):对(1)的锁定部分进行解锁;(4)将声音传送给主缓冲区,并从哪里输出(IdirectSoundBuffer:Play)。2.2.2 Server设计方案Server就是可以随时发言,实时接听,不受他人限制。对来自Client的发言申请作出响应,然后将该信息拷贝到发送缓冲区发送出去。图2.1为Server端数据流程图。NYYN创建Server套接字加入多波组,进入实时接收状态有信息到达申请信息?允许申请吗?退出发言,Server发言不需要申请普通信息显示,播放设置发音标志位1设置发音标志位0发送数据到多波组图2.1 Server端数据流程图2.2.3 Client设计方案Client就是可以实时接听,每次发言前必须发出申请信息。当申请信息发送出去后,组播组内的所有成员都可以收到。当Server发送出对申请信息的响应信息后,各个Client将根据自己的本地地址与信息中包含的地址信息做比较,如果发现申请信息中的地址信息与本机地址一致,则说明是自己的发言申请的响应,于是处理;如果信息中的地址信息与本机地址不一致,那么不处理。图2.2是Client端数据流程图。NNNYYYNY创建Client 套接字加入多播组,进入实时接收状态有信息到达申请信息吗?自己的申请响应?发言位为1?发言申请被允许申请发言发送数据到多播组普通信息显示,播放不处理发言发言位为1吗?发言,结束后将发言位置-1发言申请被驳回图2.2 Client端数据流程图2.3 界面设计 一个功能完备的语音聊天系统必须拥有友好的界面。由于本次设计的是一种随机建立服务器的系统,所以每一个用户都有可能成为服务器端。所以在任何人使用这一款软件的时候应该能够第一眼看见自己的IP地址,并且可以设置端口号其作用相当于一个密钥。当局域网中的另一个用户同时知道你的IP地址和端口号,并且你已经建立好一个服务器的情况下才能够连接。界面上应该同时拥有建立服务器和连接服务器的选项,还要有开始语音通信的按钮,以便不方便进行语音聊天的时候可以关闭该功能。市面上所有的语音聊天工具都附带有一个即时打字聊天的功能,我所设计的这款软件也拥有这样的功能,因为不是随时都有客观条件进行语音通信的。那么界面还应该有一个编辑框和一个对话框。所以界面初步在MFC中设计如图2.3所示。图 2.3 语音平台界面初步成型 可以从图2.3看出,右上方的本机IP信息,端口号信息清晰明了,一目了然。连接服务器,建立服务器按钮平行分布。左边的编辑框和对话框也很清晰,符合人们运用聊天工具的习惯。 界面很单调不够友好怎么办?想把界面的做的好看有修改主题和设置壁纸两种方法,这里我用的是嵌入壁纸这个方法。全部设置好之后运行的最后如图2.4所示。图 2.4 比较友好的界面成型设置嵌入背景的具体步骤如下:1.载入一张图片ID设置为IDB_BIT_CHUYIN.2.在CExample2_ChatRoomDlg.h中定义一个public下的CBrush m_brBk。CBrush:类CBrush封装了Windows图形设备接口(GDI)中的画刷,画刷也就是采取什么方案填充图形的背景的工具。3. 在初始化函数OnInitDialog()中加入:BOOL CExample2_ChatRoomDlg:OnInitDialog()CDialog:OnInitDialog(); CBitmap bmp;bmp.LoadBitmap(IDB_BIT_CHUYIN);m_brBk.CreatePatternBrush(&bmp);bmp.DeleteObject();return TRUE; 之所以在OnInitDialog()中进行操作是因为:OnInitDialog ( ):用于对对话框类的变量的初始化(注意:是在产生对话框之前就初始化),是WM_INITDIALOG消息产生的消息处理函数,覆盖该函数可改变对话框初始设置。4. 打开类向导,找到WM_CTLCOLOR消息,重载得对应函数OnCtlColor(),添加如下: HBRUSH CExample2_ChatRoomDlg:OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) HBRUSH hbr = CDialog:OnCtlColor(pDC, pWnd, nCtlColor);/ TODO: Change any attributes of the DC hereif (pWnd = this) return m_brBk; / TODO: Return a different brush if the default is not desiredreturn hbr;其中WM_CTLCOLOR消息的功能:WM_CTLCOLOR是一个由控制(Control)发送给它父窗口的通知消息(Notification message)。利用向导映射该消息产生函数:HBRUSH CAboutDlg:OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);参数pDC是TestDlg的设备上下文,pWnd是TestDlg中发送该消息的control指针,nCtlColor是Control的类型编码。WM_CTLCOLOR是系统在绘制控件的时候自动发送的,如果需要自定义,就截取这个消息并重载它的响应函数,用classWizard添加WM_CTLCOLOR消息然后编辑其OnCtlColor函数。这样Windows向应用程序发送消息WM_CTLCOLOR,应用程序处理WM_CTLCOLOR消息并返回一个用来绘画窗体背景的刷子句柄。 经过了以上4个步骤之后一个友好的语音聊天平台界面的设计已经很完备,用户使用这款软件会觉得很舒服。第三章 详细设计3.1 音频处理3.1.1 WAVEHDR简介本次课程设计中对音频信号的采集,处理,回放都是基于Windows下低层波形音频数据块结构WAVEHDR来实现的,因此有必要对这一数据结构进行说明,该数据结构声明如下:01.typestruct02.LPSTRlpData;/指向锁定的数据缓冲区的指针03.DWORDdwBufferLength;/数据缓冲区的大小04.DWORDdwByteRecorded;/录音时指明缓冲区中的数据量05.DWORDdwUser;/用户数据06.DWORDdwFlag;/提供缓冲区信息的标志07.DWORDdwLoops;/循环播放的次数08.structwavehdr_tag * lpNext;/保留09.DWORDreserved;/保留10. WAVEHDR;声音的采集和播放其实都是在操作这个音频数据块结构,实际上主要用到的就是第一个成员变量lpData, 所以我们只要在分配缓冲区(内存)的同时相应分配WAVEHDR数据块结构,然后将缓冲区的指针赋给对应的数据块结构的成员变量 lpData,这样当一个缓冲区填满后,也就是一个音频数据块填满了,通过消息机制就可以在消息函数中进行处理和播放,播放完后又可通过消息函数把缓冲区再送给音频设备输入驱动程序,继续进行采集并播放,当你一次性分配多个缓冲区和数据块结构并赋给音频设备输入驱动程序后,至于把哪个缓冲区填满,然后再把哪个空缓冲区赋给设备输入驱动程序,不需人为干预,完全由Windows控制,这就是一种用动态循环缓冲区实现话音的实时采集、播放的简单而巧妙的办法。3.1.2 初始化操作首先考虑到的是把从话筒中传入的声音转化为数据,然后再对其进行处理,即声音的采集与处理。Windows多媒体扩展提供2个层次的音频服务:(1)低层音频服务允许应用程序直接与音频驱动程序通信,以管理声音的播放和录制。低层音频服务要求较多的编程,但可以对播放提供更强的控制。(2)高层音频服务只需少量编程就能播放和录制音频文件。与低层音频服务相比,高层音频服务容易使用,需要编程较少。高层服务可以满足应用程序对音频的简单要求。本次课程设计中使用的是低层音频服务。低层音频服务可以更加灵活的控制不同类型的音频设备。对波形设备而言,不论是播放还是录制波形,系统要处理的数据都很多,为了少占用内存,低层音频服务以数据块为单位进行管理。他要求应用程序自己分配内存,并将内存块的地址、大小等信息告诉低层音频驱动程序,使其为录放音频操作做好准备。音频播放时,应用程序将要播放的数据填充到这个内存块中,然后通知驱动程序播放该块。驱动程序播放数据在后台进行,应用程序可以在前台继续自己的工作。当一块音频播放完时,应用程序再向驱动程序提供新的数据,如此反复,直到音频数据播放完毕。音频录制时,应用程序向驱动程序提供驱动程序录制的缓冲区内存块,当驱动程序录制充满了给定的缓冲区后,会以某种方式通知应用程序作一定的处理。驱动程序录制数据在后台进行,应用程序可以在前台继续自己的工作。要实现对音频的采集与播放,必须经过如下的初始化操作:用waveInGetNumDevs()和waveOutGetNumDevs()查看当前系统波形音频输入、输出设备;按8000Hz,16Bit,单声道,16K/S的格式设置WAVEFORMATEX结构的成员变量,当然也可以改为其他WAVE格式;用waveInOpen(.) 和waveOutOpen(.)分别调用WAVE_FORMAT_QUERY参数查看波形输入设备是否支持所设定的格式;再次调用用waveInOpen(.) 和waveOutOpen(.)分别调用CALLBACK_WINDOW参数打开波形输入设备;分别给音频数据块和音频数据缓冲区分配、锁定全局内存;初始化音频数据块结构各成员变量,主要是将每个缓冲区指针赋给对应数据块结构中的缓冲区指针变量lpData;调用waveInPrepareHeader(.)和waveInAddBuffer(.)将音频数据块赋给输入设备驱动程序;调用waveInStart(.)函数开始录音。经过以上一系列初始化操作,就可以完成音频的输入与采集了。3.1.3 消息操作录音开始后,每当有采样数据填满数据块后,设备驱动程序就会发消息MM_WIM_DATA给用户窗口,本设计中相应的消息回调函数是WriteBufferFull(),代码如下所示:void CExample2_ChatRoomDlg:WriteBufferFull(LPARAM lp,WPARAM wp)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_bClient)POSITION pos;for(pos=m_connectionList.GetHeadPosition();pos!=NULL;)CClientSocket * t= (CClientSocket*)m_connectionList.GetNext(pos); t-SendMessage(&msg);elsem_clientsocket.SendMessage(&msg);m_sound.FreeRecordBuffer();m_sound.FreePlayBuffer();lock.Unlock();/该函数的功能是首先调用自己编写的sound类的Play()函数对采集的音频进行播放。Play()函数中只有一条如下语句:memcpy(m_cBufferOut,m_cBufferIn,MAX_BUFFER_SIZE);可以看出,该函数实际上就是输入的音频数据拷贝到输出的数据数组中,因为已经经过了前面所述的初始化过程,这行代码就可以实现对音频输入数据的回放。之后WriteBufferFull()函数又将采集到的数据通过服务器发送给客户端,或是通过客户端发送给服务器。这要根据运行的进程是服务器端进程还是客户端进程而定。这样,每当有音频输入后,一旦数据块被填满,就能通过消息响应函数实现音频的播放并通过网络进行传送。这就能实现音频的连续采集与传送,达到了本次课程设计的目的。3.2 音频在局域网中的传输3.2.1 创建Socket派生类上面完成了对声音的采集和处理,现在考虑怎样与局域网内的主机建立连接并把音频数据发送出去。采用套接字(Socket)网络编程接口来完成数据的收发工作。Socket是对通信端点的一种抽象,他提供了一种发送和接收数据的机制,在Visual C+6.0中Microsoft的基本类库(Microsoft Foundation Class或MFC)提供了2个用于WinSock编程的类,这2个类在不同程度上对WinSockAPI函数进行了封装,这样在很大程度上简化了工作。CAsyncSocket类是在低程度上对WinSock API的封装,他提供低级接口。Csocket类是从CAsyncSocket类派生而来的,他提供高一级的抽象处理。本次课程设计中就创建了两个基于Csocket的派生类CServerSocket和CClientSocket分别来对服务器和客户端的Socket进行处理。它们都直接继承Csocket类,因此能使用Csocket类的所有函数。此外针对服务器和客户端的不同,还分别添加了各自的功能函数。在CServerSocket类中就加入了Init函数,该函数主要实现服务器进程相关的建立端口,监听客户端连接等功能。还加入了OnAccept()函数来对新的游客请求连接服务器进行处理。在CClientSocket类中则加入了Init(),SendMessage(),CloseSocket()等函数分别来实现客户端的初始化,发送信息,关闭端口等操作。3.2.2 自动获得本机IP地址因为在局域网内与其他主机进行连接时必须要使用到对方的IP地址,只有将正确的主机IP地址作为一个参数传入到本程序使用的connect函数中,才能与相应的主机成功进行连接,进而进行语音的传输。本次设计中就实现了程序运行时自动获得本机的ip地址并通过IP地址控件显示出来,这样就免去了用户专门去查询自己电脑的IP地址的步骤,也体现了本设计人性化的一面。本次设计中将获得自身电脑的IP地址的函数加入到了CClientSocket类中,要获得自己主机的IP地址,首先需要得到主机名,获得主机名的函数GetLocalHostName代码如下: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;该函数主要是调用gethostname()函数将本地计算机的名称获得,然后传入到CString类型的参数sHostName中。得到主机名后,就可以使用GetIpAddress()函数得到主机的IP地址了,该函数的代码如下:int CClientSocket:GetIpAddress(const CString &sHostName, CString &sIpAddress)struct 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);/将一个IP转换成一个互联网标准点分格式的字符串if(sIpAddress.IsEmpty()sIpAddress=_T(没有取得IP地址!);return 0;从这段代码可以看出,这个函数利用到了前面得到的主机名作为参数调用gethostbyname函数得到一个记录主机信息的结构体hostent,然后从该结构体中提取出主机的IP地址。由于得到的IP地址是网络字节顺序,后面又调用了memmove()和inet_ntoa()函数对该IP地址进行了转换。最后得到就是CString类型的互联网标准点分格式的字符串。下图3.1是程序运行后的初始界面,从界面的右上方的IP地址控件中可以看出本机的IP地址是04:图 3.1 程序初始界面3.2.3 基于TCP协议的Socket编程进行Socket编程需要首先选择一定的协议,常用的协议有TCP、UDP、ARP等,本次设计中就选择了面向连接的TCP协议,这是一种提供给用户进程的可靠的全双工字节流面向连接的协议。它要为用户进程提供虚电路服务,并为数据可靠传输建立检查。使用该协议能够提供可靠的数据传输,能够保证本设计语音的传输地可靠和准确。在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Server model)。该模式的建立基于以下两点:1、非对等作用;2、通信完全是异步的。客户机/服务器模式在操作过程中采取的是主动请示方式:首先服务器方要先启动,并根据请示提供相应服务:(过程如下)1、打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求。2、等待客户请求到达该端口。3、接收到重复服务请求,处理该请求并发送应答信号。4、返回第二步,等待另一客户请求5、关闭服务器。客户方:1、打开一通信通道,并连接到服务器所
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 栀子炒焦炮制技术
- 离婚财产分割协议中遗产继承补充条款
- 夫妻双方共同债务承担及房产过户补充协议范本
- 《个性化定制离婚协议模板:财产分割与子女监护》
- 高新技术企业员工待岗及薪酬保障协议
- 竞业限制及保密协议范本:离职员工竞业限制细则
- 离职员工竞业限制协议及违约责任认定范本
- 高端设备研发成果保密及技术转移合同模板
- 绿色环保住宅小区物业服务合同履行环境质量担保书
- 精美的古风课件
- 2025年下半年安徽省港航集团有限公司所属企业社会公开招聘22名考试参考试题及答案解析
- 人教PEP版六年级英语上册全册教案
- 3D打印技术在制造业2025年发展趋势及市场前景可行性分析报告
- 综合楼玻璃安装合同协议书范本模板6篇
- 2025年度集中供暖项目暖气设施安装及售后服务合同
- 护士医护人员职业安全防护培训
- 2025福建厦门市公安局同安分局招聘警务辅助人员50人笔试备考试题及答案解析
- 2025年四川省建筑安全员A证模拟试题(及答案)
- 莲山教学课件下载
- 大学生创新创业基础课件 第7章 创业与创业历程
- 班主任育人故事经验分享陪伴每一名学生慢慢成长模板
评论
0/150
提交评论