终于用java实现了语音聊天,贴出代码来,一起学习,嘿嘿。
import java.net.*;
import javax.sound.sampled.*;
public class ChartReceive extends Thread {
//格式
private AudioFormat format = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED, 44100.0f, 16, 1, 2, 44100.0f, false);
//管道
private SourceDataLine line;
private byte[] data;
public ChartReceive() {
try {
DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
line = (SourceDataLine) AudioSystem.getLine(info);
} catch (Exception e) {
e.printStackTrace();
}
}
public void run() {
System.out.println("receive threading start");
int length=(int)(format.getFrameSize()*format.getFrameRate()/2.0f);
try{line.open(format);line.start();
DatagramSocket socket=new DatagramSocket(ChartSend.PORT);
while(true){
//数组的创建载什么时候,是否影响数据信息?
data=new byte[length];
DatagramPacket dp=new DatagramPacket(data,data.length);
socket.receive(dp);
line.write(data,0,data.length);
System.out.println("receive success "+new String(data,"UTF-8"));
}
}catch(Exception e){
e.printStackTrace();
}
}
}
import java.io.IOException;
import java.net.*;
import javax.sound.sampled.*;
public class ChartSend extends Thread {
public static final int PORT = 3333;
private InetAddress toIp;// 目的ip
private TargetDataLine line;// 管道
private byte[] data;// 存放每次从麦克获得的数据
// 格式
private AudioFormat format = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED, 44100.0f, 16, 1, 2, 44100.0f, false);
public ChartSend(InetAddress toIp) {
this.toIp = toIp;
DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
try {
line = (TargetDataLine) AudioSystem.getLine(info);
} catch (LineUnavailableException e) {
e.printStackTrace();
}
}
public void run() {
System.out.println("send threading start");
try {
line.open(format, line.getBufferSize());
line.start();
int length = (int) (format.getFrameSize() * format.getFrameRate() / 2.0f);
while (true) {
data = new byte[length];
line.read(data, 0, data.length);
sendData();
}
} catch (LineUnavailableException e) {
e.printStackTrace();
}
}
private void sendData() {
try {
DatagramPacket dp = new DatagramPacket(data, data.length, toIp,
PORT);
DatagramSocket ds = new DatagramSocket();
ds.send(dp);
ds.close();
System.out.println("send success");
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
真不知道百度这最大长度是怎么计算的。本来想好好整理一下格式。我先把代码复制到word里,然后从word里拷过来,这样就可以保证格式和开发工具里的一样,便于阅读,可以总是提示超过了最大长度。如果直接粘贴过来,就没事了。
分享到:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SO1UWZ1kjZyAzYlVjMkNzMyYmNlNmN2YDOiBDM5UGOx8CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
2012-03-13 13:02
浏览 5976
评论
你好,可以提供调用方法吗?需要的Jar,能发下源码吗?谢谢
3 楼
alexly61
2013-08-17
很强大!后台原理基本上看懂了,就是怎样提供语音接口呢,前台通过的麦克输出,怎样调用上面的代码呢,请指点下。
2 楼
高级java工程师
2012-04-25
lxy66_88 写道
很强大 学习了
1 楼
lxy66_88
2012-04-19
很强大 学习了