Потоковое аудио на Java
Я пишу приложение, в котором я записываю голос на устройстве Android и отправляю его на ПК с помощью сокетов (UDP). Problem I'm facing is how to pass incoming data (byte[]) to speaker?
Моя текущая реализация просто создает экземпляры Speaker каждый раз при получении данных. Что делает голос немного дерганным. Это выглядит очень распространенным явлением, но я не смог понять это.
Вот мой код, который получает данные и отправляет их на динамик
while (true) {
final DatagramPacket packet = new DatagramPacket(receiveData, receiveData.length);
// Reading data from socket - UDP
serverSocket.receive(packet);
new Thread(new Runnable() {
@Override
public void run() {
// Sending data to speaker in separate thread
SpeakerManager.toSpeaker(packet.getData());
}
}).start();
}
Вот код, который играет голос на динамике
private static final AudioFormat format = new AudioFormat(Common.SAMPLE_RATE, 16, 1, true, false);
public static void toSpeaker(byte soundbytes[]) {
try {
DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, format);
try (SourceDataLine sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo)) {
sourceDataLine.open(format);
FloatControl volumeControl = (FloatControl) sourceDataLine.getControl(FloatControl.Type.MASTER_GAIN);
volumeControl.setValue(6.0f);
sourceDataLine.start();
sourceDataLine.write(soundbytes, 0, soundbytes.length);
sourceDataLine.drain();
}
} catch (Exception e) {
System.out.println("Not working in speakers...");
e.printStackTrace();
}
}
Я почти уверен, что голос записывается просто отлично, собирая несколько входящих данных в большой буфер и воспроизводя их вместе. Но я хочу иметь непрерывный голос. Я также должен сделать то же самое в обратном направлении.
Я могу представить способ связать динамик с входным потоком, и он будет продолжать воспроизводить голос, когда он получит данные в гнездо. Но не знаю, как это сделать.
Хочу подчеркнуть, что хочу передавать голос в реальном времени, поэтому любое решение с сохранением и отправкой мне не подойдет.