语音聊天室

语音聊天室【语音聊天室】1 双方之间的网路连线 要进行频数据的传输,首先就是要建立数据连结 。常用的通讯协定中,TCP较可靠,所以用在不允许数据丢失的套用上 。而UDP则较多套用于处理速度要求较快、数据传输可靠性要求不是很高的套用上,如数据广播 。通信协定的选择取决于我们所要做的套用的类型 。怎样建立网路连线,稳定的接收和传送音频信号的数据流是关键 。
基本介绍中文名:语音聊天室
外文名:Voice Chat Room
原理介绍在网路上传输音频的方面存在的问题主要可以归纳为以下几点:信号採集回放在进行音频信号的採集中我们必须考虑到採样率的问题,声音信号的採样率有8Khz、16Khz、32Khz、44Khz等,每种数据採样虑产生的数据量都不一样,越高的採样率产生的数据量越大,所以我们要选择合适的採样率以适应网路的频宽 。信号编码解码如果把直接採集到的音频信号数据流在网路上进行传输,它所占有的频宽也是十分大的,以8Khz的採样率採集14位的音频数据那幺就有以下这样的一个式子:

语音聊天室

文章插图
语音聊天室从中我们可以看出以这样的方式传输音频数据,每秒需要向网路中传送112kb的数据 。所以 。从节省频宽的角度考虑,我们很有必要对这样的数据进行压缩 。对多媒体信号的压缩我们有许多可以选择的格式,如mp2、mp3、GSM等等,现在用的最多的是MP3格式 。同样,我们这里也存在一个对压缩格式进行选择的问题,考虑到音频数据传输的及时性,对传输的音频数据质量的要求,以及各种压缩格式的压缩比率以及进行压缩和解压缩所要耗费的系统资源等方面问题,选择合适的压缩格式就显得尤为重要 。解决方法下面就针对前面提出的问题讨论一下解决的办法双方之间的网路连线在这方面有其独特的优势,Java提供了丰富的网路类库的支持,可以轻鬆编写多种类型的网路通信程式 。在我下面的例子中我就使用了TCP/IP协定,通过Java的Socket类进行编程2 音频信号的採集和回放以及音频数位讯号的编码与解码 在解决这两个问题的时候,在网上很幸运地通过一些文章的介绍,找到了Answer Machine 演示程式的原始码(由of j的Florian Bomers 和Matthias Pfisterer编写,网址在这个程式代码中,有几个解决我们问题所需要的类,而且作者将这些类封装的很好,我们基本不需要做什幺改动,只需要禁止其中的调试信息的输出就行了,更可贵的是它还封装了几种常见的音频格式 。其中的GSM格式(Global System for Mobile Telecommunications)就是我们下面例子中採用的压缩格式,GSM格式可以将128kbps 的音频数据流 (16bit通过8k Hz的音频採样) 压缩为13kbps 的音频数据流,非常适合语音信号的传送,所以可谓是一石二鸟 。介绍1、考米网“考米网”是深圳市盈华讯方通信技术有限公司领先推出的能够电话聊天交友的网站,在网路交友的基础上增添电话聊天,提供一对一通话、多人通话、二人电话约会、自建会议聊天室、电话中传送的语音短讯,设定个性化个人资料等十几种功能 。在不方便使用电脑的时候,也能通过手机、电话拨打400热线,随时和网上的好友保持联繫 。2、YY聊天是一种YY团队语音工具,是多玩游戏网针对中文用户设计的多人语音群聊工具 。它是一款免费语音软体,稳定清晰的语音工具,用于游戏玩家交流等 。即时通话,是一款不错的通讯软体 。3、ISpeakISpeak娱乐互动平台(简称IS),是国内专业游戏语音服务商,拥有上千万注册用户,每天活跃用户上百万,公会频道近10万个的规模,已经成为国内一流的语音互动平台 。IS以网路游戏用户为基础,提供专业的语音、聊天、社区论坛等 。为用户提供免费的语音频道和无偿服务;为公会提供一个更好的实现自我平台,促进和扶持公会的成长;为厂商提供一个游戏推广,服务玩家的超大型互动娱乐社区 。4、QQ语音腾讯公司一直为使用QQ的用户提供语音聊天服务 。其语音聊天的缺点是通话质量差,只能电脑对电脑传播,所以一直没有大範围传播开 。原始码分析我分析过这几个类的原始码,不得不佩服它的作者,每个类的原始码都很精炼,大家可以自己分析一下 。好了下面就给大家讲讲这几个类,并且将它们用到的Java Sound API中的类和函式等一併做个简单介绍,让大家对Java Sound API中常用的类也有个大致的了解 。由于Java Sound API中的类比较多 。限于篇幅无法对所有用到的类做详尽的解释,以下内容只是简单提及了各个类的用途和使用规範,有关Java Sound API中类的具体介绍请大家访问这里[url=http://java./j2se/1.4.2/docs/api/]查找javax.sound.sampled的相关内容 。以下的提到几个档案是从Answer Machine 演示程式的原始码中提取出来的,由于是开放原始码的程式,大家在使用的时候请注意相关的公共协定AMAudioFormat类(封装在AMAudioFormat.java档案中)AMAudioFormat类封装了CD、FM、TELEPHONE、GSM这四种质量的音频格式的参数,使用起来也非常简单,这样我们在使用Java Sound API时就不用自己去写那些複杂的代码了,但为了明白Java Sound API的原理,我们需要对它的代码做一下分析 。它使用了Java Sound API中的AudioFormat这个类,这个类非常重要,在Java中对任何音频数据的使用都要实现通过它指定所需要使用的音频格式,AudioFormat类有一个嵌套的类AudioFormat.Encoding,实际上大部分对AudioFormat类的使用都是使用的这个嵌套的类 。AMAudioFormat类的重要方法:名称:getLineAudioFormat调用格式:getLineAudioFormat(整型音频格式代号)返回值: 根据传递音频格式代号生成的AudioFormat对象 。说道这里大家可能要问了,那幺通过Java Sound API可以直接使用GSM格式吗?答案是比较複杂,但同样有解决的办法,作者在这里使用了另外的开源程式的类库-tritonus的GSM编码解码库 。大家需要在这里下载tritonous_share.jar和tritonus_gsm.jar两个档案,并在AMAudioFormat类中引用,这样就完成了GSM格式的设定 。需要告诉大家的是在对AMAudioFormat.java这个类进行编译后,我们的程式运行的时候就可以不需要tritonous_share.jar和tritonus_gsm.jar这两个档案的支持了 。(封装在AudioCapture.java档案中)2AudioCapture类封装了从音频硬体捕获音频数据并自动编码为GSM音频压缩数据的过程,并且通过它的getAudioInputStream()方法提供给我们一个音频数据输入流,我们就可以直接将这个流传送到网路中 。AudioCapture 类的重要方法:名称:getAudioInputStream调用格式:getAudioInputStream()返回值:AudioInputStream对象AudioCapture 类使用了Java Sound API中的AudioInputStream、AudioFormat、AudioSystem这几个类和TargetDataLine、LineListener接口 。除了AudioFormat类我再简单介绍一下其他的类:AudioInputStream 类是带有特殊音频格式和长度的InputStream类,它有两个构造方法,分别是AudioInputStream(InputStream stream, AudioFormat format,long length)和AudioInputStream(TargetData -Line line) 。TargetDataLine 接口是DataLine接口的一种,通过它就可以直接从音频硬体获取数据了,它有几个常用的方法,分别是:open(AudioFormat format)、void open(AudioFormat format, int bufferSize)、int read(byte[] b, int off, int len) 。