局域网内的即时通信软件设计_第1页
局域网内的即时通信软件设计_第2页
局域网内的即时通信软件设计_第3页
局域网内的即时通信软件设计_第4页
局域网内的即时通信软件设计_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

1、 目 录第一章 绪论51.1 研究背景51.2 研究内容61.3 研究意义6第二章 系统开发工具及环境介绍72.1.开发工具与环境72. 1. 12.1.1 visual studio的介绍72.1.2. sdk介绍72.1.3. winsock2.0编程技术82.2开发环境需求介绍92.2.1 硬件环境92.2.2 软件环境92.2.3 运行环境需求分析10第三章 freetalk软件的需求分析与方案选择11第一节 功能需求分析113.1.1 应用程序的功能需求分析11第二节 性能需求分析123.2.1 软件的时间特性123.2.2 软件处理的准确性和及时性133.2.3 软件的开放性和系统

2、的可扩充性133.2.4 软件的易用性和易维护性133.2.5 软件的标准性13第三节 预处理方案选择133.3.1 设计方案原则的选择143.3.2 开发工具选择143.3.3 算法选择分析14第四章系统详细设计分析16第一节 音频聊天模块设计174. 1. 1 声音的录入、播放以及压缩184.1.2 音频数据的播放与解压缩244.1.3 音量控制模块设计24第二节视频模块设计274.2.1 视频捕获与压缩编码(解压缩)的相关技术274. 2. 2 视频聊天模块的总体结构设计33第三节文本聊天模块设计34第五章系统实现与总结展望355.1 研究内容总结365.2 存在的不足和未来的工作36局

3、域网内的即时通信软件设计摘要: 随着互联网技术的日益成熟,无论是在日程生活中,还是在学习工作上,即时通信都体现出了它的独特魅力,充当着一种不可或缺的通信手段,作为一种多元化的信息工具,它必将受到人们的喜爱。因此,为了满足相互沟通的需要,开发了此即时通信聊天系统freetalk。 该软件主要完成了友好的用户界面的设计,以及即时通信工具中较为常用的功能 ,如基本的文本聊天, 语音聊天和视频聊天。该软件的一个重要特点是采用sdk开发,因此相较mfc而言具有较高的运行效率。其中关键的实现部分的类是自行封装的,因此可操作性较强,效率较高。该软件在vc+6.0平台下开发,相关模块通过使用winsock编程

4、技术实现。关键词:即时通信;sdk;语音视频; winsockinstant messaging software in lanabstract: with the rapid development of the internet,no matter in the working or studying, instant messaging reflects its unique charm and serving as an indispensable means of communication as a tool for a wide range of information , an

5、d it will be popular in the future. therefore, in order to communicate with each other to meet the needs of the communication of each other.i developed the instant messaging chat system named freetalk. the software major to complete a friendly user interface design, and instant communication tools m

6、ore commonly used functions, such as the text chat, voice chat and video chat. the software is an important characteristic of the development using sdk, mfc. therefore, it has higher operating efficiency. some of the realization of the class is by myself , and it can be more feasible and efficient.

7、the software platform in vc + +6.0 under development, related winsock programming modules through the use of technology.key word: instant messaging ; sdk; audio; vedio; winsock; 第一章 绪论1.1研究背景 即时通信是指能够即时发送和接收互联网消息等的业务,是当今流行的一种以网络为基础的实时通信方式,它以实用性,快捷性,准确性在当今通信系统中独占鳌头,也是今后在各个领域中发展的焦点,它不仅提供了一种进行实时沟通的方式,同

8、时为用户提供了实时的互动和反馈。自1998年面世以来,特别是近几年的迅速发展,即时通信的功能日益丰富,逐渐集成了电子邮件、博客、音乐、电视、游戏和搜索等多种功能。即时通信不再是一个单纯的聊天工具,它已经发展成集交流、资讯、娱乐、搜索、电子商务、办公协作和企业客户服务等为一体的综合化信息平台。随着移动互联网的发展,互联网即时通信也在向移动化扩张。目前微,aol,雅虎等重要即时通信提供商都提供通过手机接入互联网即时通信的业务,用户可以通过手机与其他已经安装了相应客户端软件的手机或电脑收发消息。产品最早的创始人是三个以色列青年,是他们在1996年做出来的,取名叫icq。1998年当icq注册用户数达

9、到1200万时,被aol看中,以2.87亿美元的天价买走。目前icq有1亿多用户,主要市场在美洲和欧洲,已成为世界上最大的即时通信系统。现在国内的即时通信工具有:qq、百度hi、e话通、uc、网易泡泡、盛大圈圈、淘宝旺旺等等。qq的前身oicq在1999年2月第一次推出,目前几乎接近垄断中国在线即时通讯软件市场。百度hi具备文字消息、音视频通话、文件传输等功能,您可通过它找到志同道合的朋友,并随时与好友联络感情。局域网是是指在某一区域内由多台计算机互联成的计算机组,局域网内的用户会经常有数据,信息方面的交流需要,因此,一个功能齐全,性能稳定的局域网即时通信软件能够极大的方便局域网内用户的需要。

10、当前,在我们校园网内有两款优秀的即时通信软件在使用,飞鸽传书和飞秋feiq,本人也是这两款工具的用户,因此 ,如何开发出一款相对稳定实用的即时通信工具,成为了我的研究课题。1.2 研究内容局域网即时通信软件的设计,着眼点在两个部分,一是定位于局域网内使用,这样能够忽略和避免一些由于网络环境造成的不便,同时简化开发模型;二是即时通信,因此需要具备一些实用的功能。首先,最基本的文本聊天需要具备,这是通信工具的基本功能;其次,加入了一些当今流行的可语音可视频的聊天功能。这样能极大的拓展发挥即时通信的意义。因此,这款工具实际上是一个带语音会话功能的沟通媒介。贯穿与整个设计的是windows套接字编程,

11、首先文本聊天中消息的发送与接受均要使用socket. 而且,视频数据,与音频数据的传输仍然要使用socket.其次,音频部分的关键是音频数据的捕获,音频数据的处理,包括音频原始数据的压缩处理,解压缩处理,用到g.729标准;视频部分主要是视频帧的捕获,视频数据的压缩与解压缩,用到h.263标准;整个网络传输采用udp协议。总体来说,要实现视频采集、视频压缩、音频采集、音频压缩、音频播放、数据传输、命令控制等一系列与可视通讯有关的功能。1.3 研究意义局域网即时通信工具是一种极其方便的局域网内沟通工具,我们的日常生活离不开信息的交流,即时通信因为它的快捷性,准确性,信息多元性以及其易操作受到了广

12、大用户的喜爱。虽然本论文设计研究仅仅停留在面向个人用户层面,但是我们也了解,即时信息的沟通在企业层面已经发挥了举足轻重的作用并且在不久的将来会变得更加重要。第二章 系统开发工具及环境介绍2.1.开发工具与环境2.1.1 2.1.1 visual studio的介绍visual studio 是微软公司推出的开发环境。是目前最流行的 windows 平台应用程序开发环境。目前已经开发到 9.0 版本,也就是 visual studio 2008。 visual studio 可以用来创建 windows 平台下的 windows 应用程序和网络应用程序,也可以用来创建网络服务、智能设备应用程序和

13、 office 插件。本次设计所用的开发工具是microsoft visual c+ 6.0。 visual c+ 6.0是microsoft公司推出的一种可视化编程工具。它支持多平台和交叉平台的开发,将各种编程工具如编辑器、连接器、调试器等巧妙的结合在一起,构成一个完美的可视化开发环境。用户无需通过繁杂的编程操作,即可完成windows下应用程序的编辑、编译、测试和细化等工作。2.1.2. sdk介绍sdk是software development kit的缩写,中文意思是“软件开发工具包”。这是一个覆盖面相当广泛的名词,可以这么说:辅助开发某一类软件的相关文档、范例和工具的集合都可以叫做“

14、sdk”。具体到我们这个系列教程,我们后面只讨论广义 sdk 的一个子集即开发 windows 平台下的应用程序所使用的 sdk。由于 sdk 包含了使用 api 的必需资料,所以人们也常把仅使用 api 来编写 windows 应用程序的开发方式叫做“sdk 编程”。而 api 和 sdk 是开发 windows 应用程序所必需的东西,所以其它编程框架和类库都是建立在它们之上的,比如 vcl 和 mfc,虽然他们比起“sdk 编程”来有着更高的抽象度,但这丝毫不妨碍它们在需要的时候随时直接调用 api 函数。我们仍然用vc6的 ide (集成开发环境)来编写sdk程序,启动vc6后选择fil

15、e菜单的new.选项,在出现的new对话框的projects标签内选择win32 application,然后在projects name指定项目的名字,在location中指定路径后按ok按钮,在出现的对话框中,如果你想要用c语言来写程序可以选择an emtpy project,如果你想创建一个带有winmain入口函数和普通参数的设定的项目,可以选择a simple win32 application,如果您想创建一个简单典型的“hello world!”win32sdk application应用程序,可以选择a typical hello world! application。确定项目

16、类型后按finish完成。2.1.3. winsock2.0编程技术自从1993年1月winsock1.1成为业界的一项标准,它为通用的tcp/ip应用程序提供了超强和灵活的api。但随着internet技术的高速发展,网络已经完全变化了,winsock1.1的技术必须的到改进才能满足这种日新月异的变化。winsock1.1原先设计的生活把api限定在tcp/ip的范畴里,而winsock2.0正规化了一些其他协议api,如atm,ips/spx和decnet协议,这样使得调用的api可以共通各种协议。winsock2.0还加入了一些重要的函数。winsock2.0不仅允许各种协议栈的并存,而

17、且从理论上讲,它还允许创造一个与网络协议无关的应用程序。winsock2.0可以基于服务的需要透明的选择协议。使用winsock2.0的机制,应用程序可以适用于不同的网络名和网络地址。从内核这一层来讲,winsock2.0 是winsock1.1的api和体系结构的超集。下面列出一些winsock2.0的新的特征。 多重协议支持:wosa体系结构可以是服务满足插入和堆叠的需要。 传输协议独立:根据服务提供不同的协议。 多重名空间: 根据需要的服务和解析的主机名选择协议。 分散和聚集:从多个缓冲空间接收和发送数据。 重叠的i/o和事件对象:利用win32的范例和加强吞吐量。 服务质量:根据每个s

18、ocket协商和跟踪网络带宽。 多点和多点传送:协议与aoi无关,而协议决定api。 条件接收:可以选择性的决定是否接收连接。 连接和断开数据:为传输协议用的。 socket 共享:多个进程可以共享一个socket句柄。 厂商号和厂商扩展机制: 厂商可以自主的添加api。 提供分层服务:为存在的传输提供者增加服务。windows socket2 与windows socket1.1在两个基础上向后兼容:源码和二进制代码。这就实现了windows sockets 应用程序和任何版本的windows sockets之间的最大的互操作性,而且也减少了windows sockets应用程序实用化则、网

19、络协议栈提供者和服务提供者的许多麻烦。综上所述,windows socket2具有较多的优势,使用它进行开发可以强化应用程序的效率和性能。2.2开发环境需求介绍2.2.1硬件环境(1)硬件配置原则具有可靠性,可用性和安全性,具有完善的技术支持。能够满足个人学习和设计需要。(2)运行本软件所需的硬件资源cpu: 800m及以上;内存: 128m及以上2.2.2 软件环境(1)系统软件配置原则 能够满足该软件的可靠性,可用性和安全性的要求(2)系统软件配置方案 配置有持续工作能力、高稳定性、高度可集成的开放式标准的操作系统,如windows2000,windows xp,unix,linux等。

20、配备符合ansi/iso标准的高级程序设计语言处理软件。如:visual c+ 6.0。 熟悉c+高级程序设计语言。2.2.3 运行环境需求分析(1)、硬件环境cpu:500m及以上;内存:64 m及以上。(2)、软件环境可以运行在微软公司近年来所出的各种操作系统。如windows 98、windows me、windows 2000、windows nt等。第三章 freetalk软件的需求分析与方案选择 即时通信软件广泛应用与各个领域当中,无论是企业还是个人,即时通信工具以其方便和快捷性都被当成首选的交流和沟通工具。随着技术的发展,即时通信软件的设计也正在被添加入更多更好、更加实用的功能,

21、以便更好的适应用户的需求。 第一节 功能需求分析3.1.1 应用程序的功能需求分析局域网内的即时通信工具 ,首先要有本文通信的功能,其次增强功能中要包含视频聊天与音频聊天的功能。其它的一些功能则根据这三个主功能进行扩展。文本聊天:该模块要实现和指定的局域网ip地址进行文字聊天,同时,应该能将聊天记录保存,也能将聊天记录清除。通讯录:该模块应该能将已经 与其通信过的 地址和姓名 记录下来,并保存在通讯录中,以便下次发起呼叫时可以直接提供选择。在这个模块中,应具备一些常用的操作,例如对某联系对象的添加、删除,信息更改。软件设置模块:这一模块应该能实现对整个软件的一些常用操作,例如 是否设定软件开机

22、自动运行,启动软件时是否显示主窗口,自定义呼叫声音,热键设置等。音频聊天:即时通信的关键功能之一,在这一模块中,在连接成功后,能通过本地音频设备与指定局域网远程设备进行语音聊天,同时要保证声音的质量与连续性。附加功能中包括聊天中的声音波形显示。音量控制:本模块能够实现对语音聊天的音量控制,包括输入音量和输出音量的大小控制。视频聊天:本模块也是软件的关键模块,要能够通过本地视频设备捕获本地视频图像并在本地视频窗口中动态显示;同时能够获取远程视频图像并且在远程窗口中显示。视频截图:本功能模块提供对远程视频图像进行抓屏保存。日志保存:保存用户使用软件的相关信息,比如对方请求连接信息、接受请求等。第二

23、节 性能需求分析为了保证系统能够长期、安全、稳定、可靠、高效的运行,freetalk应该满足以下的性能需求:3.2.1软件的时间特性响应时间不宜过长,应在一般人可以接受的范围内;更新处理时间,随着服务种类的增加,freetalk系统将相应地进行更新和升级;3.2.2 软件处理的准确性和及时性软件处理的准确性和及时性是系统的必要性能。在软件设计和开发过程中,要充分考虑软件当前和将来可能承受的工作量,使软件的处理能力和响应时间能够满足大量用户对信息处理的需求。能否尽量提高播放进程的同步性将关系到以后本软件的推广范围。因此在软件开发过程中,必须采用一定的方法提高播放进程的同步性,实现实时播放。 3.

24、2.3软件的开放性和系统的可扩充性网络视频聊天软件在开发过程中,应该充分考虑以后的可扩充性,例如传输文件类型的增加,录像功能等。这些都要求软件提供足够的手段进行功能的调整和扩充。而要实现这一点,应通过软件的开放性来完成,既软件应是一个开放软件,只要符合一定的规范,可以简单的加入和减少软件的模块,配置系统的硬件。通过软件的修补、替换完成软件的升级和更新换代。3.2.4软件的易用性和易维护性网络视频聊天软件是直接面对用户的,而用户可能对计算机并非很熟悉。这就要求软件能够提供良好的用户接口,易用的人机交互界面。要实现这一点,就要求软件应该尽量使用用户熟悉的术语和中文信息的界面;针对用户可能出现的使用

25、问题,要提供足够的在线帮助,缩短用户对软件熟悉的过程。3.2.5软件的标准性软件在设计开发使用过程中应遵循主流国际、国家和行业标准,例如tcp/ip网络协议及iso9002标准所要求的质量规范等;同时,在自主开发本软件时,要进行良好的设计工作,制订行之有效的软件工程规范,保证代码的易读性、可操作性和可移植性。第三节 预处理方案选择3.3.1 设计方案原则的选择本应用程序的设计方案原则如下:1、采用较为先进的技术力量,保证应用程序在技术上具备一定的优势。2、采用成熟的技术,保证应用程序的安全性和可靠性。3、应用程序便于扩展和维护,易于技术的更新。4、应用程序充分利用现有的资源,尽量减少不必要的再

26、投资。5、编写的代码必须严谨易读,代码的解释必须清楚明白,为应用程序的再开发提供应尽的责任。3.3.2开发工具选择本次设计所用的开发工具是microsoft visual c+ 6.0。 visual c+ 6.0是microsoft公司推出的一种可视化编程工具。它支持多平台和交叉平台的开发,将各种编程工具如编辑器、连接器、调试器等巧妙的结合在一起,构成一个完美的可视化开发环境。用户无需通过繁杂的编程操作,即可完成windows下应用程序的编辑、编译、测试和细化等工作。3.3.3 算法选择分析 1.音频压缩编码方案: g.729编码方案是电话带宽的语音信号编码的标准,对输入语音性质的模拟信号用

27、8khz、采样,16比特线性pcm量化。 g.729的解码也是按帧进行的,主要是对符合g.729协议的码流进行解码,得到相应的参数,根据语音产生的机理,合成语音。解码过程主要分为:参数解码;后滤波处理。1.参数解码首先解码得到线谱对参数,并将线谱对参数转换为线性预测系数。然后解码出基音周期,获得自适应码本矢量v(n)。解码出固定码本矢量的四个脉冲的位置和符号,计算出固定码本矢量c(n)。解码出固定本预测增益gc和固定码本增益,接着得到激励信号。最后将激励信号输入到线性预测合成滤波器中,计算出重构语音。2.后滤波处理后滤波处理主要是自适应后滤波。自适应后置滤波器是由三个滤波器级连而成:长时后置滤

28、波器hp(z),短时后置滤波器hf(z),频谱倾斜补偿滤波器ht(z),后面接着进行一个自适应增益控制过程。后置 滤波器的系数每一个子帧更新一次。后置滤波能够有效地改善合成出的语音质量。2.视频压缩编码方案h.263标准是由国际电信联盟(itu)发布的,对视频会议和视频电信应用提供视频压缩(编码).实时的视频通信在实时情形下开发一个可以有效工作的视频编码和编码器时,有很多问题是要被说明的,包括: 码率控制 实际的通信信道对于每秒钟它们可以处理的能力有限度.在很多种情形下,码率是一个定值(比如说pots,idsn等) h.263编码器的基础是对于每个编码的帧生成一个变的码值.如果运动估计/补偿过

29、程工作正常的话,那么就有更少的非0系数被用来编码. 然而,如果运动估计工作不那么正常的话(比如说当视频场景中包括复杂的运动时),就会有很多的非0系数来被编码.这样编码的值会增加. 为了映射这个可变的码率值到一个cbr(固定码率值)信道,编码器必须进行码率控制.编码器计算编码器输出的码率.如果它太高的话,它会通过增加标量化因子来提高压缩率:这会导致更高的压缩比(码率会更低),但也同时在解码器给出了更低的画质.如果码率下降的话,编码 器就通过降低量化器的标量化因子来进行压缩.这样会在解码端造成更高的友率和更佳的画质. 同步 编码器和解码器必须是同步的,特别是如果视频信号与音频信号一起的话.h.26

30、3码流包含了一定数目的头或叫标记:这些是特殊的记号用来标记解码器在当前帧的所处的位置.如果解码器失掉了同步,那么它就向前扫描下一个标记来重新同步并恢复解码.应该注意到甚至是很小的同步上的损失都会造成很严重的解码质量的问题.所以在这样一个充满了嗓音的传输环境中设计一个视频编码系统的时候必须非常小心.第四章 系统详细设计分析 本章主要介绍系统的结构设计的流程以及系统各模块的功能及相关原理。音频输入设备视频输入设备pcm音频数据dib视频帧g.729编码h.263编码音频视频同步数据网络数据传送(套接字)文本消息图1 基本流程图figure 1 basic flowchart音频输入设备视频捕获设备

31、图形窗口音频输出设备音频原始数据视频原始数据视频原始数据音频原始数据音频数据包视频数据包视频数据包音频数据包音频压缩器视频压缩器音频缓冲器音频解压缩器视频解压缩器sockets 图2 具体系统流程图 figure 2 the explicit system flowchart第一节 音频聊天模块设计语音聊天程序的设计思路是发送声音的一端将硬件接口采集到的声音数据通过socket发送到另外一端,另外一端根据得到的声音数据调用硬件接口播放声音。其核心就是声音数据的采集,编码 和声音数据的网络传输。在这个模块中,将使用到win32 api 提供的一组关于多媒体服务的函数接口。这些api 主要涉及波形

32、音频设备的相关内容。 在本实例设计中,需要用到一些常用的与音频相关的windows api函数: waveingetnumdevs : 此函数返回当前系统中的波形银屏输入设备的数目。如果该函数返回0,则表示无音频输入设备或者发生了其他的错误。这个函数一般在程序初始时对音频设备进行检测。 waveoutgetnumdevs: 此函数返回当前系统中的波形银屏输出设备的数目。如果该函数返回0,则表示无音频输入设备或者发生了其他的错误。这个函数一般在程序初始时对音频设备进行检测。 waveinopen: 此函数用来打开一个指定的音频输入设备并且设置音频数据捕获后的处理方法。 waveinprepare

33、header: 此函数主要用来准备一块接收音频输入的缓冲区。 如果函数成功,则返回mmsyserr_noerror。 waveinaddbuffer: 此函数向音频输入设备传送一块输入缓冲区,当缓冲区被填满的时候,程序会得到通知。 waveinunprepareheader: 函数清除了waveinprepareheader准备的内容。这个函数必须是在设备驱动填满了数据缓冲区后调用,且必须在释放buffer之前调用。 waveinstart: 该函数用来在某个音频输入设备上的录音。 waveinreset: 该函数将停止在指定的音频输入设备上录入音频数据,并且它将所有的buffer表示未满,然

34、后返回到应用程序当中。 waveinstop : 此函数用来停止录音。 waveoutopen:用来打开一个指定的音频输出设备并且设置音频数据的处理方法。 waveoutprepareheader: 函数主要用来准备一块接受音频输出的缓冲区。 waveoutwrite: 该函数用来发送一个数据块到指定的音频输出设备。 waveoutreset : 该函数用来停止在指定的音频输出设备上输入数据。 waevoutunprepareheader: 函数清除awveoutprepareheader 函数的准备内容。 4.1.1声音的录入、播放以及压缩声音的录入有一些基本的流程。录音的准备工作主要有四点

35、:首先要打开录音设备;然后获得录音句柄;指定录音格式;最后分配若干用于录音的缓冲区。 开始录音时,先将所有的内存块提供给录音设备用来录音,录音设备就会一次将语音数据写入内存,当一块内存写满,录音设备就会发一个widnows 消息 mm_wim_data 给相应的窗口,通知程序做相关处理,这时就可以对数据进行压缩编码处理,然后通过网络发送并且在本地机上播放出来,然后把内存清空,返还给录音设备进行录音,这样就形成了一个循环录音的过程。结束录音只需要释放所有的内存块,并关闭录音设备。录音部分关键的函数最基本的调用流程如下:waveinopenwaveinprepareheaderwaveinaddb

36、ufferwaveinstartwaveinstopwaveinclose 在本软件实例中,设定声音基本信息格式为: waveformatex wf; wf.wformattag= wave_format_pcm; wf.cbsize= 0;wf.wbitspersample=16; /采样比特数设置为16wf.nsamplespersec=8000; /采样频率为 8khzwf.nchannels=1; /非立体声,设置为1wf.navgbytespersec= wf.nsamplespersec*(wf.wbitspersample/8);wf.nblockalign= wf.nchann

37、els *(wf.wbitspersample/8);定义cwavein 和cwaveout 两个类来控制音频设备的初始化工作,caudiorec 和 caudioplay.从以上两个类继承而来,分别实现录音操作和放音操作。部分代码如下:/打开录音设备 bool cwavein:opendev(waveformatex* pfmt,dword dwcallback,dword dwcallbackinstance,dword fdwopen)bool bret=false;waveformatex wf;if(!pfmt)/默认格式 wf.wformattag= wave_format_pcm

38、;wf.cbsize= 0;wf.wbitspersample=16;wf.nsamplespersec=8000;wf.nchannels=1;wf.navgbytespersec= wf.nsamplespersec*(wf.wbitspersample/8);wf.nblockalign= wf.nchannels *(wf.wbitspersample/8);pfmt=&wf;mmresult mmr;mmr=waveinopen(0,wave_mapper,pfmt,0,0,wave_format_query);if(mmr)setlastmmerror(mmr);goto ret;

39、mmr=waveinopen(&m_hin,wave_mapper,pfmt,dwcallback,dwcallbackinstance,fdwopen);if(mmr)setlastmmerror(mmr);goto ret;bret=true;ret:return bret;上面函数实现了音频录音设备的打开,接下来在caudiorec类中有 内存分配部分,和录音开始的控制部分。关键代码如下:/为录音分配内存,为了使录音连续,采用多个缓冲区for(i=0;idwbytesrecorded!=size_audio_frame)break;copymemory(pmgr-m_audiolocal

40、,pwh-lpdata,size_audio_frame);pmgr-onencodeaudiodata(pmgr-m_audiolocal,size_audio_frame);/视频编码压缩函数waveinprepareheader(hwavein)msg.wparam,pwh,sizeof(wavehdr);waveinaddbuffer(hwavein)msg.wparam,pwh,sizeof(wavehdr);break;return msg.wparam;音频压缩部分,采用g.729编码标准,部分代码如下:/* va_g729a api functions prototypes a

41、nd constants */* 这段代码是voiceage公司封装的g729 lib库,提供了可以直接使用的 以下四个音频编码函数接口 */extern c void va_g729a_init_encoder(); /初始化编码器extern c void va_g729a_encoder(short *speech, unsigned char *bitstream);/音频编码extern c void va_g729a_init_decoder(); /初始化解码器extern c void va_g729a_decoder(unsigned char *bitstream, sho

42、rt *synth_short, int bfi); /音频解码函数/压缩音频帧函数实现bool ccodecmgr:encodeaudiodata(char *pin,int len,char* pout,int* lenr)if(!pin|len!=size_audio_frame|!pout) return false;/音频帧编码,直接使用接口函数实现va_g729a_encoder(short*)pin,(byte*)pout);va_g729a_encoder(short*)(pin+160),(byte*)pout+10);va_g729a_encoder(short*)(pin

43、+320),(byte*)pout+20);va_g729a_encoder(short*)(pin+480),(byte*)pout+30);va_g729a_encoder(short*)(pin+640),(byte*)pout+40);va_g729a_encoder(short*)(pin+800),(byte*)pout+50);if(lenr)*lenr=size_audio_packed;return true; 到此为止,音频的录入和编码压缩完成,然后需要的就是通过socket将音频数据发送到指定的客户。4.1.2 音频数据的播放与解压缩关于音频的解压缩和播放,流程基本和前面

44、相同,只是顺序变更一下,对方在收到音频压缩包后,仍需使用g.729标准解压,然后在对方音频设备上播放。具体实现类同于以上所述的录入与压缩部分,不再详述。4.1.3 音量控制模块设计 音量控制是音频聊天设计中不可或缺的环节。这里要用到混音器(mixer)编程。其中 mixerline 结构体描述了声频线的状态信息,该结构体结构如下:typedef struct dword cbstruct; / mixerline structure的大小,用字节表示 dword dwdestination; /目的线的索引dword dwsource; dword dwlineid; /混音器设备定义的标识符

45、 dword fdwline; dword dwuser; dword dwcomponenttype; /声频线的组件类型 dword cchannels;/音频线最多能处理的单独的音频信道数目, dword cconnections; dword ccontrols; char szshortnamemixer_short_name_chars; char sznamemixer_long_name_chars; struct dword dwtype; dword dwdeviceid; word wmid; word wpid; mmversion vdriverversion; ch

46、ar szpnamemaxpnamelen; target; mixerline; mixerlinecontrols 结构体包含了音频线的控制信息。结构如下:typedef struct dword cbstruct; dword dwlineid; union dword dwcontrolid; dword dwcontroltype; ; dword ccontrols; dword cbmxctrl; lpmixercontrol pamxctrl; mixerlinecontrols; 混音器相关函数介绍:mixergetlineinfo :该函数获得混音器设备音频线的指定信息。m

47、ixergetlinecontrols :该函数获得一个或者多个同音频线关联的控制。如果成功则返回mmsyserr_noerror。mixergetcontroldetails :获得同一个音频线相关联的单个控件的详细信息。mixersetcontroldetails : 指定同一个音频线相关联的单个控件的属性。mixerclose: 关闭指定的混音设备。 因此,一个基本的音量控制流程如下:mixeropenmixergetlineinfomixergetlinecontrolsmixergetcontroldetailsmixersetcontroldetails mixerclose 图3

48、 音量控制流程图 figure 3 volume control flowchart根据这个思路,设计一个专门进行音量控制的类cvolunectrl.其中有三个主要函数:一个是进行相关的初始化和准备工作;一个获取音量大小;一个用来设置音量。 其中关键部分代码如下:/此函数进行初始化和准备工作 bool cvolumectrl:open(uint udevhandle,bool bflag) close();dword f;if(bflag)f=mixer_objectf_hwaveout;elsef=mixer_objectf_hwavein;mmresult mmr;mmr=mixerope

49、n(&m_h,udevhandle,0,0,f);if(mmr!=mmsyserr_noerror)return false;m_mxl.cbstruct = sizeof(m_mxl);m_mxl.dwdestination = 0;mmr=mixergetlineinfo(hmixerobj)m_h,&m_mxl,mixer_getlineinfof_destination);if (mmsyserr_noerror != mmr)return false;m_mxlc.cbstruct = sizeof(m_mxlc);m_mxlc.dwlineid = m_mxl.dwlineid;m

50、_mxlc.ccontrols = m_mxl.ccontrols;m_mxlc.cbmxctrl = sizeof(m_mxctrl);m_mxlc.dwcontroltype = mixercontrol_controltype_volume;m_mxlc.pamxctrl = &m_mxctrl;mmr = mixergetlinecontrols(hmixerobj)m_h, &m_mxlc, mixer_getlinecontrolsf_onebytype);if (mmsyserr_noerror != mmr)return false;return true;/音量大小的获得dw

51、ord cvolumectrl:getvolume()if(!m_h) return 0;mixercontroldetails mxcd;mixercontroldetails_unsigned mxcd_u;mxcd.cbstruct=sizeof(mxcd);mxcd.cchannels=1;mxcd.dwcontrolid=m_mxctrl.dwcontrolid;mxcd.padetails=&mxcd_u;mxcd.cbdetails=4;mxcd.cmultipleitems=m_mxctrl.cmultipleitems;mmresult mmr;mmr=mixergetcontr

温馨提示

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

评论

0/150

提交评论