Я работаю над небольшим проектом обмена мгновенными сообщениями, который реализует собственный алгоритм шифрования, который я разработал. Тем не менее, сети не моя сильная сторона.
По сути, здесь я пытаюсь предоставить синхронизированный поток вывода звука, используя арки один ко многим.
Итак, до сих пор мне удалось передать звук по 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%, только некоторые указатели в правильном направлении и пример кода)