Я пытаюсь создать одноранговую передачу звука между двумя java приложениями, используя эту webRT C Java реализацию собственного интерфейса и используя простой nodejs сервер с сокетами для выполнить сигнализацию, я мог установить sh соединение, хотя я не мог заставить звуковые дорожки работать, пробовал добавлять дорожки, добавлять трансиверы, передавать audioDeviceModule на PeerConnectionFactory, ничего не сработало, я просто хочу прикрепить дорожку микрофона от вызывающего абонента и правильно воспроизвести его на другой стороне.
то, что у меня сейчас есть попытка подключить аудио:
AudioDeviceModule mod = new AudioDeviceModule();
mod.setRecordingDevice(MediaDevices.getAudioCaptureDevices().get(1));
mod.initRecording();
mod.setPlayoutDevice(MediaDevices.getAudioRenderDevices().get(1));
mod.initPlayout();
PeerConnectionFactory factory = new PeerConnectionFactory(mod);
RTCPeerConnection connection = factory.createPeerConnection(config, observer);
AudioOptions audioOptions = new AudioOptions();
AudioSource audioSource = factory.createAudioSource(audioOptions);
AudioTrack audioTrack = factory.createAudioTrack("audioTrack", audioSource);
connection.addTrack(audioTrack, List.of("stream"));
демонстрация, представленная в их репозитории, сложна, и это не так ' Чтобы помочь мне понять API, будет полезен простой пример «для начала». от первого экземпляра к серверу через сокет, сервер перенаправляет его второму экземпляру, который устанавливает удаленный cryption и отправляет ответ серверу, сервер перенаправляет его первому экземпляру, который устанавливает удаленное описание
Caller:
connection.createOffer(options, new CreateSessionDescriptionObserver() {
@Override
public void onSuccess(RTCSessionDescription description) {
connection.setLocalDescription(description, new SetSessionDescriptionObserver() {
@Override
public void onSuccess() {
System.out.println("caller ready");
}
@Override
public void onFailure(String error) {
System.out.println("failed to set local description : " + error);
}
});
//Sending offer as a json object to the server
JSONObject data = new JSONObject();
JSONObject offer = new JSONObject();
offer.put("sdp", description.sdp);
offer.put("type", description.sdpType);
data.put("offer", offer);
data.put("to", socketId);
mySocket.emit("call-user", data.toString());
System.out.println("offer sent to " + socketId);
//Listening for answer events
mySocket.on("answer-made", e -> {
JSONObject obj = (JSONObject) e[0];
String sdp = obj.getJSONObject("answer").getString("sdp");
System.out.println("received answer from " + obj.getString("socket"));
connection.setRemoteDescription(new RTCSessionDescription(RTCSdpType.ANSWER, sdp),
new SetSessionDescriptionObserver() {
@Override
public void onSuccess() {
System.out.println("Connection Successful");
}
@Override
public void onFailure(String error) {
System.out.println("failed to set remote description : " + error);
}
});
});
}
@Override
public void onFailure(String error) {
System.out.println("failed to create offer: " + error);
}
});
Callee:
socket.on("call-made", e -> {
JSONObject obj = (JSONObject) e[0];
String sdp = obj.getJSONObject("offer").getString("sdp");
String from = obj.getString("socket");
System.out.println("received offer from " + from);
RTCSessionDescription offer = new RTCSessionDescription(RTCSdpType.OFFER, sdp);
connection.setRemoteDescription(offer, new SetSessionDescriptionObserver() {
@Override
public void onSuccess() {
connection.createAnswer(options, new CreateSessionDescriptionObserver() {
@Override
public void onSuccess(RTCSessionDescription description) {
connection.setLocalDescription(description, new SetSessionDescriptionObserver() {
@Override
public void onSuccess() {
JSONObject data = new JSONObject();
JSONObject answer = new JSONObject();
answer.put("sdp", description.sdp);
answer.put("type", description.sdpType);
data.put("answer", answer);
data.put("to", socketId);
System.out.println("answer sent to " + socketId);
mySocket.emit("make-answer", data.toString());
System.out.println("Peer2Peer Connection Successful");
}
@Override
public void onFailure(String error) {
System.out.println("failed to set local description : " + error);
}
});
}
@Override
public void onFailure(String error) {
System.out.println("failed to create answer : " + error);
}
});
}
@Override
public void onFailure(String error) {
System.out.println("failed to set remote description : " + error);
}
});
});
сервер ничего не делает, но пересылает предложение / ответ другому сокету
соединение установлено правильно, и я получаю следующие выходные данные без сбоев
вызывающий:
connecting to server...
connected, connection id : 7rO5KeRKQQjmGBiRAAAB
offer
enter id to call
nVlQRjwWsoPrM63uAAAA
offer sent to nVlQRjwWsoPrM63uAAAA
caller ready
received answer from nVlQRjwWsoPrM63uAAAA
Peer2Peer Connection Successful
Вызываемый:
connecting to server...
connected, connection id : nVlQRjwWsoPrM63uAAAA
received offer from 7rO5KeRKQQjmGBiRAAAB
answer sent to 7rO5KeRKQQjmGBiRAAAB
Peer2Peer Connection Successful