webRTC java desktop attach media tracks and consume them correctly
Asked Answered
D

0

10

I'm trying to build a peer2peer audio transmission between two java apps, using this webRTC Java native interface implementation, and using a simple nodejs server with sockets to do the signaling, I could establish a connection although I couldn't get the audio tracks to work, tried adding tracks, adding transceivers, passing the audioDeviceModule to the PeerConnectionFactory, nothing has worked, I just want to attach the microphone track from the caller and have it play properly on the other side.

what I currently have as attempt to connect audio:

    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"));

the demo provided on their repo is complicated and It didn't help me understand the API, a simple "getting started" example would be helpful.

what I have so far: the structure is basic I'm running two java instances, sending an offer from the first instance to the server through the socket, the server forwards it to the second instance, which sets the remote description and sends the answer to the server, the server forwards it to the first instance, which sets the remote description

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);
        }
    });
});

the server does nothing but forwards the offer/answer to the other socket

the connection is being set correctly and I'm getting the following outputs with no failures

Caller:

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

Callee:

connecting to server...
connected, connection id : nVlQRjwWsoPrM63uAAAA
received offer from 7rO5KeRKQQjmGBiRAAAB
answer sent to 7rO5KeRKQQjmGBiRAAAB
Peer2Peer Connection Successful
Disputation answered 11/7, 2020 at 13:26 Comment(4)
can you please post code for this: I couldn't get the audio tracks to work, tried adding tracks, adding transceivers, passing the audioDeviceModule to the PeerConnectionFactory?Dignify
@GokhanDilek added it in the editDisputation
@LukasOwen were you able to resolve this issue ?Winterize
unfortunately not, I couldn't find any ready for use well documented webRTC java implementation.Disputation

© 2022 - 2024 — McMap. All rights reserved.