java获取麦实现语音聊天

java中TargetDataLine 接口提供从目标数据行的缓冲区读取所捕获数据的方法,

SourceDataLine 接口提供将音频数据写入数据行的缓冲区中的方法。

如从音频捕获设备获取其数据的数据行。

调用start方法开始执行操作。

调用stop方法停止。


package chat; import javax.swing.JTextArea; /** * @author Hello * 把那几个sender、receiver又包装了一下,供GUI调用 */ public class Chat { private MessageReceiver massageReceiver; private MessageSender massageSender; private SoundReceiver soundReceiver; private SoundSender soundSender; public Chat(JTextArea textArea){ massageSender = new MessageSender("231.0.0.1",10000,textArea); massageReceiver = new MessageReceiver("231.0.0.1",10000,1024,textArea); soundSender = new SoundSender("231.0.0.1",10001,1024); soundReceiver = new SoundReceiver("231.0.0.1",10001,1024); massageReceiver.start(); } public void send(String message){ massageSender.send(message); } public void soundStart(){ soundReceiver.start(); soundSender.start(); } public void soundStop(){ soundReceiver.stop(); soundSender.stop(); } }
package chat; import javax.sound.sampled.*; /** * @author Hello * 放音部分 */ public class SoundSender extends UDPSender implements Runnable{ private TargetDataLine line; private int bufferLength; private Thread thread; private boolean isStart; public SoundSender(String groupAddress, int port, int bufferLength){ super(groupAddress,port); AudioFormat format =new AudioFormat(8000,16,2,true,true); DataLine.Info info = new DataLine.Info(TargetDataLine.class,format); try { line = (TargetDataLine) AudioSystem.getLine(info); line.open(format, line.getBufferSize()); } catch (LineUnavailableException e) { e.printStackTrace(); } this.bufferLength = bufferLength; isStart = false; } public void run() { byte[] buffer = new byte[bufferLength]; while(isStart&&!thread.isInterrupted()){ line.read(buffer, 0,buffer.length);//接受麦的数据写入buffer send(buffer); } } public void start(){ if(thread == null || !thread.isAlive()){ thread = new Thread(this); line.start(); thread.start(); isStart = true; } } public void stop(){ thread.interrupt(); line.stop(); isStart = false; } }
package chat; import javax.sound.sampled.*; /** * */ public class SoundReceiver extends UDPReceiver implements Runnable{ private SourceDataLine line; private Thread thread; private boolean isStart; public SoundReceiver( String groupAddress, int port, int bufferSize){ super(groupAddress, port, bufferSize); AudioFormat format =new AudioFormat(8000,16,2,true,true); DataLine.Info info = new DataLine.Info(SourceDataLine.class,format); try { line = (SourceDataLine) AudioSystem.getLine(info); line.open(format, 10240); } catch (LineUnavailableException e) { e.printStackTrace(); } } public void run() { while(isStart&&!thread.isInterrupted()){ byte[] data = super.receive(); line.write(data, 0, data.length);//将data的数据转化为音频 } } public void start(){ if(thread == null || !thread.isAlive()){ thread = new Thread(this); line.start(); isStart = true; contect(); thread.start(); } } public void stop(){ thread.interrupt(); line.stop(); isStart = false; close(); } }
package chat; import java.io.IOException; import java.net.*; /** * @author chch87 * 发送UDP报文的基类,扩展出MessageSender和SoundSender */ public class UDPSender { protected MulticastSocket s; protected InetAddress group; protected int port; protected DatagramPacket dgp; public UDPSender(String groupAddress, int port){ this.port = port; try { s = new MulticastSocket(); group = InetAddress.getByName (groupAddress);//group一定要是个组播组!如231.0.0.1 } catch (IOException e) { e.printStackTrace(); } dgp = new DatagramPacket (new byte[0], 0, group, port); } public void close(){ if(s != null) s.close (); } protected void send(byte[] buffer){ dgp.setData (buffer); dgp.setLength (buffer.length); try { s.send (dgp); } catch (IOException e) { e.printStackTrace(); } } }
package chat; import java.io.IOException; import java.net.*; /** * @author chch87 * 接受UDP报文的基类,扩展出MessageReceiver和SoundReceiver */ public class UDPReceiver{ protected MulticastSocket s; protected InetAddress group; protected byte[] buffer; protected DatagramPacket dgp; protected int port; protected int bufferSize; protected boolean isClose; public UDPReceiver(String groupAddress, int port, int bufferSize){ try { s = new MulticastSocket(port); group = InetAddress.getByName(groupAddress);//group一定要是个组播组!如231.0.0.1 s.joinGroup (group); //s.setLoopbackMode(true);//在局域网测试时,可以将禁止回调打开 } catch (IOException e) { e.printStackTrace(); } buffer = new byte[bufferSize]; dgp = new DatagramPacket (buffer, bufferSize); isClose = false; this.port = port; this.bufferSize = bufferSize; } public void close(){ if(s != null && group != null){ try { s.leaveGroup (group); s.close (); } catch (IOException e) { e.printStackTrace(); } isClose = true; } } public void contect(){ if(isClose){ try { s = new MulticastSocket(port); s.joinGroup (group); } catch (IOException e) { e.printStackTrace(); } buffer = new byte[bufferSize]; dgp = new DatagramPacket (buffer, bufferSize); isClose = false; } } protected byte[] receive(){ try { s.receive (dgp); } catch (IOException e) { e.printStackTrace(); } return buffer; } protected int getDgpLength(){ return dgp.getLength(); } protected String getIP(){ return dgp.getAddress().toString(); } }


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值