Я не могу транслировать микрофонный голос на разных клиентов.
Я создал java-приложение, которое может использовать tcp-соединение для чата и голосового потока в локальной сети, при этом функция чата работает нормально на каждом клиенте, но потоковая передача голоса является проблемой. только два клиента смогли использовать функцию голосовой связи, но не все. Основная идея заключается в том, что тот, кто запускает класс MD, сможет записывать голос и передавать его разным клиентам, а все подключенные клиенты будут только слушать голос (не отвечать).
Я новичок в программировании на Java, поэтому не могу понять проблему. если кто-нибудь может порадовать меня в этом. Заранее спасибо.
// MD.java
public class MD
{
ServerSocket MyService;
Socket clientSocket = null;
InputStream input;
TargetDataLine targetDataLine;
OutputStream out;
AudioFormat audioFormat;
SourceDataLine sourceDataLine;
int Size = 10000;
byte tempBuffer[] = new byte[Size];
static Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo();
MD() throws LineUnavailableException, HeadlessException, UnknownHostException, InterruptedException {
/*JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("Network Phone");
JLabel label = new JLabel("Server ip: "+InetAddress.getLocalHost().getHostAddress(), JLabel.CENTER );
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
*/
// frame.pack();
// frame.show();
try {
Mixer mixer_ = AudioSystem.getMixer(mixerInfo[1]); // Select Available Hardware Devices for the speaker, for my Notebook it is number 1
audioFormat = getAudioFormat();
DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, audioFormat);
sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);
sourceDataLine.open(audioFormat);
sourceDataLine.start();
MyService = new ServerSocket(5000);
clientSocket = MyService.accept();
captureAudio();
input = new BufferedInputStream(clientSocket.getInputStream());
out = new BufferedOutputStream(clientSocket.getOutputStream());
Thread readbffr = new Thread(new Runnable(){
public void run(){
try{
while (input.read(tempBuffer) != -1) {
sourceDataLine.write(tempBuffer, 0, Size);
}
}
catch(IOException ex){
//Handle This Too
ex.printStackTrace();
}
};
});
readbffr.start();
} catch (IOException e) {
e.printStackTrace();
}
}
private AudioFormat getAudioFormat() {
float sampleRate = 8000.0F;
int sampleSizeInBits = 16;
int channels = 2;
boolean signed = true;
boolean bigEndian = false;
return new AudioFormat(
sampleRate,
sampleSizeInBits,
channels,
signed,
bigEndian);
}
public static void main(String[] args) throws LineUnavailableException, UnknownHostException, HeadlessException, InterruptedException {
MD s2 = new MD();
}
private void captureAudio() {
try {
audioFormat = getAudioFormat();
DataLine.Info dataLineInfo = new DataLine.Info(
TargetDataLine.class, audioFormat);
Mixer mixer = null;
System.out.println("Server Ip Address "+InetAddress.getLocalHost().getHostAddress());
System.out.println("Available Hardware Devices:");
for (int cnt = 0; cnt < mixerInfo.length; cnt++) {
mixer = AudioSystem.getMixer(mixerInfo[3]); // Select Available Hardware Devices for the micro, for my Notebook it is number 3
if (mixer.isLineSupported(dataLineInfo)) {
System.out.println(cnt+":"+mixerInfo[cnt].getName());
targetDataLine = (TargetDataLine) mixer.getLine(dataLineInfo);
}
}
targetDataLine.open(audioFormat);
targetDataLine.start();
Thread captureThread = new CaptureThread();
captureThread.start();
} catch (Exception e) {
System.out.println(e);
}
}
class CaptureThread extends Thread {
byte tempBuffer[] = new byte[Size];
@Override
public void run() {
try {
while (true) {
int cnt = targetDataLine.read(tempBuffer, 0, tempBuffer.length);
out.write(tempBuffer);
out.flush();
}
} catch (Exception e) {
System.out.println(e);
}
}
}}
// Employee.java
public class Employee {
boolean stopCapture = false;
ByteArrayOutputStream byteArrayOutputStream;
AudioFormat audioFormat;
TargetDataLine targetDataLine;
AudioInputStream audioInputStream;
BufferedOutputStream out = null;
BufferedInputStream in = null;
Socket sock = null;
SourceDataLine sourceDataLine;
/**
* Launch the application.
* @param args
*/
public static void main(String[] args) {
Employee i = new Employee();
i.captureAudio();
}
void captureAudio() {
try {
String IP =InetAddress.getLocalHost().getHostAddress();
sock = new Socket("192.168.1.1",5000);
out = new BufferedOutputStream(sock.getOutputStream());
in = new BufferedInputStream(sock.getInputStream());
Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo();
System.out.println("Available Hardware devices:");
for (int cnt = 0; cnt < mixerInfo.length; cnt++) {
System.out.println(cnt+":"+mixerInfo[cnt].getName());
}
audioFormat = getAudioFormat();
/*
DataLine.Info dataLineInfo = new DataLine.Info(
TargetDataLine.class, audioFormat);
Mixer mixer = AudioSystem.getMixer(mixerInfo[3]); //Select Available Hardware Devices for the micro, for my Notebook it is number 3.
targetDataLine = (TargetDataLine) mixer.getLine(dataLineInfo);
targetDataLine.open(audioFormat);
targetDataLine.start();
Thread captureThread = new CaptureThread();
captureThread.start();
*/
DataLine.Info dataLineInfo1 = new DataLine.Info(
SourceDataLine.class, audioFormat);
sourceDataLine = (SourceDataLine) AudioSystem
.getLine(dataLineInfo1);
sourceDataLine.open(audioFormat);
sourceDataLine.start();
Thread playThread = new PlayThread();
playThread.start();
} catch (Exception e) {
System.out.println(e);
e.printStackTrace();
System.exit(0);
}
}
class CaptureThread extends Thread {
byte tempBuffer[] = new byte[10000];
@Override
public void run() {
byteArrayOutputStream = new ByteArrayOutputStream();
stopCapture = false;
try {
while (!stopCapture) {
int cnt = targetDataLine.read(tempBuffer, 0,
tempBuffer.length);
out.write(tempBuffer);
if (cnt > 0) {
byteArrayOutputStream.write(tempBuffer, 0, cnt);
}
}
byteArrayOutputStream.close();
} catch (Exception e) {
System.out.println(e);
e.printStackTrace();
System.exit(0);
}
}
}
private AudioFormat getAudioFormat() {
float sampleRate = 8000.0F;
int sampleSizeInBits = 16;
int channels = 2;
boolean signed = true;
boolean bigEndian = false;
return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed,
bigEndian);
}
class PlayThread extends Thread {
byte tempBuffer[] = new byte[10000];
@Override
public void run() {
try {
while (in.read(tempBuffer) != -1) {
sourceDataLine.write(tempBuffer, 0, 10000);
}
sourceDataLine.drain();
sourceDataLine.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}