webRT C java настольный компьютер прикрепляет медиа-треки и правильно их использует - PullRequest
7 голосов
/ 11 июля 2020

Я пытаюсь создать одноранговую передачу звука между двумя 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...