Воспроизведение аудио, передаваемого по протоколу http

#java #audio #stream

#java #Аудио #поток

Вопрос:

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

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

Итак, до сих пор мне удавалось передавать аудио по HTTP-соединению в формате в кодировке base64, но здесь я застрял.

Я понятия не имею, как воспроизводить аудио в режиме реального времени, не считывая одни и те же аудиоданные дважды (перекрытие)

аудиосервер

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

 /*
 * Decompiled with CFR 0.139.
 */
package SIM.net.client.networking;

import DARTIS.crypt;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.TargetDataLine;

import com.sun.org.apache.xml.internal.security.utils.Base64;

public class audioServer {
    public static void start(String[] key) {
        AudioFormat format = new AudioFormat(8000.0f, 16, 1, true, true);
            TargetDataLine microphone = null;
            try {
                microphone = AudioSystem.getTargetDataLine(format);
            } catch (LineUnavailableException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
            try {
                microphone = (TargetDataLine)AudioSystem.getLine(info);
            } catch (LineUnavailableException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            try {
                microphone.open(format);
            } catch (LineUnavailableException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            int CHUNK_SIZE = 1024;
            byte[] data = new byte[microphone.getBufferSize() / 5];
            microphone.start();             
            int bytesRead = 0;    
            do {

                    if (bytesRead >= 4096) {
                        byte[] audioData = out.toByteArray();
                    String base64img = Base64.encode(audioData);
                    String audioclip;
                    if (key.length > 9999) {
                    audioclip = crypt.inject(base64img, key);
                    } else {
                        audioclip = base64img;
                    }
                    audioHandler.setdata(audioclip);
                    bytesRead = 0;
                    out.reset();

                } else {
                    int numBytesRead = microphone.read(data, 0, CHUNK_SIZE);
                    System.out.println(bytesRead  = numBytesRead);
                    out.write(data, 0, numBytesRead);
                }

                }
                    while (true);
    }
}
 

обработчик звука

 package SIM.net.client.networking;


import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.URI;
import java.util.HashMap;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

public class audioHandler
implements HttpHandler {
    public static String audiodata;

    public static void setdata(String imgdta) {
        audiodata = imgdta;
    }

    public void handle(HttpExchange he) throws IOException {
        HashMap parameters = new HashMap();

    }

    public static void main(String[] args) throws Exception {
        HttpServer server = HttpServer.create(new InetSocketAddress(9991), 0);
        server.createContext("/audio", new MyHandler());
        server.setExecutor(null); // creates a default executor
        server.start();
        audioServer.start(new String[3]);
    }

    static class MyHandler implements HttpHandler {
        @Override
        public void handle(HttpExchange he) throws IOException {
            URI requestedUri = he.getRequestURI();
            String query = requestedUri.getRawQuery();
            he.sendResponseHeaders(200, audiodata.replace("n", "").replace("r", "").length());
            OutputStream os = he.getResponseBody();
            os.write(audiodata.toString().replace("n", "").replace("r", "").getBytes());
            os.close();
        }
    }
}

 

Пожалуйста, поймите, этот код изначально был написан для потоковой передачи снимков веб-камеры по протоколу http в режиме реального времени, по одному кадру за раз, если этот дизайн не подходит для потоковой передачи звука, пожалуйста, укажите мне правильное направление, я обычно лучше всего учусь на примерах, редактируя и наблюдая за изменениями в его выводе, поэтому любой пример / пример кода очень поможет.(я не прошу вас решить это для меня на 100%, просто несколько указателей в правильном направлении и пример кода)

Комментарии:

1. Здесь я должен отметить, что я хочу выполнить это с помощью внутреннего http-сервера в моем jar, а не потоковой передачи напрямую через сокеты, чтобы данные передавались только по сети по требованию и могли быть легко переданы через WWW и доступны через простые http-вызовы.

2. github.com/pdglobal/SIMJAVA/tree/master/SIMJAVA/src/main/java/…

3. Теперь я правильно буферизую 4 КБ аудиоданных за раз. Теперь, чтобы просто выяснить, как взять эти буферизованные данные и превратить их в слышимый поток звуковых данных и вывести на динамики…