java中TargetDataLine
接口提供从目标数据行的缓冲区读取所捕获数据的方法,
SourceDataLine
接口提供将音频数据写入数据行的缓冲区中的方法。
如从音频捕获设备获取其数据的数据行。
调用start方法开始执行操作。
调用stop方法停止。
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();
}
}
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;
}
}
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();
}
}
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();
}
}
}
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();
}
}