Потоковое аудио на 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();
    }
}

Я почти уверен, что голос записывается просто отлично, собирая несколько входящих данных в большой буфер и воспроизводя их вместе. Но я хочу иметь непрерывный голос. Я также должен сделать то же самое в обратном направлении.

Я могу представить способ связать динамик с входным потоком, и он будет продолжать воспроизводить голос, когда он получит данные в гнездо. Но не знаю, как это сделать.

Хочу подчеркнуть, что хочу передавать голос в реальном времени, поэтому любое решение с сохранением и отправкой мне не подойдет.

0 ответов

Другие вопросы по тегам