快速业务通道

用Java实现网络语音信号传送 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-07-04
来的音频数据,而PhoneSPK在一个循环中不断的将音频数据转换为音频信号,完成类似电话听筒的功能。

子类VoiceSender 就作为第二线程启动的时候,startPhone() 方法传递给它的参数是实例化的CallLink 子类curCallLink , 子类VoiceSender 通过实例化的AudioCapture 对象PhoneMIC 将音频信号压缩成GSM数据,并通过curCallLink 将音频数据发送到具有目标IP 地址的计算机上,完成类似电话受话器的功能。

在这里实例化的CallLink 子类curCallLink 就相当于两个电话之间的电话线,这样通过我以上的解释大家对程序的原理就有一个大概的了解了吧。

其中的音频数据发送线程和音频数据接收线程是同步的,不过考虑到网络的因素,可能在声音的传输上有一些延迟,不过由于延迟比较小对及时听到对方的话语影响不大。

用Java实现网络语音信号传送 - 编程入门网

用Java实现网络语音信号传送(5)

时间:2010-07-08

编写代码摘要:

在使用AudioCapture 类和AudioPlayStream 类的方法之前需要知道怎样初始化这两个类。在声明AudioCapture 对象的时候需要传递给它一个静态的整型值用于表达将音频信号压缩的方式,这个静态的整型常量可以是AMAudioFormat 类的以下四个值之一: FORMAT_CODE_CD 、FORMAT_CODE_FM 、FORMAT

_CODE_TELEPHONE 、FORMAT_CODE_GSM 。所以声明AudioCapture 对象就要用一下的形式:

private AudioCapture PhoneMIC null; PhoneMIC new AudioCapture(AMAudioFormat. FORMAT_CODE_GSM);

而声明AudioPlayStream 对象则不同,我们在初始化它的时候需要传递给它一个AudioFormat 对象,用于通知它我们所要播放音频的格式,这个AudioFormat 对象可以通过AMAudioFormat 类的getLineAudioFormat(格式参数值)方法获得,其中格式参数的取值和上面提到过的AMAudioFormat 的四个值相同,所以声明AudioPlayStream 对象就要用以下的形式:

private AudioPlayStream PhoneSPK null; AudioFormat format null; format AMAudioFormat.getLineAudioFormat (AMAudioFormat.FORMAT_CODE_GSM); PhoneSPK new AudioPlayStream(format);

在这之后就可以使用AudioCapture 和AudioPlayStream 对象的open() 方法打开音频捕获和音频回放通道完成它们的初始化了。---www.bianceng.cn。如以下的形式:

PhoneMIC.open(); PhoneSPK.open();

初始化完成之后要使AudioPlayStream 对象播放声音还需要以下过程,首先建立一个缓冲区(字节数组)用于存放从网络传来的音频数据流,然后执行AudioPlayStream 对象的start() 方法使AudioPlayStream

对象开始声音的回放,这时执行一个while 循环,在循环中将音频流数据写入缓冲区,再使用AudioPlayStream对象的write()方法将缓冲区的数据还原成语音信号然后播放出来。如下面的例子:

boolean complete false; byte[] gsmdata new byte[bufSize]; int numBytesRead 0; ...... PhoneSPK.start(); ...... complete false; while((!Thread.currentThread().interrupted()) ) {  try  {   numBytesReadplaybackInputStream.read(gsmdata);   if(numBytesRead == -1)   {    complete=true;    break;   }   PhoneSPK.write(gsmdata, 0, numBytesRead);  }  catch (IOException e)  {   System.exit(1);  } }

用Java实现网络语音信号传送(6)

时间:2010-07-08

其中complete 的值用于标志终止声音播放的异常原因。

类似的,初始化完成之后要使AudioCapture 对象捕获和压缩声音数据还需要其他的操作,首先声明一个InputStream 对象,赋其值为AudioCapture 对象的getAudioInputStream() 方法的返回值,执行

AudioCapture 对象的start() 方法,然后在建立一个循环,将通过InputStream 的read() 方法得到的数

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号