Search code examples
raspberry-pigstreamerkurentogstreamer-1.0

listen to audio stream from kurento media server with gstreamer


I am trying to send an audio stream from point A to kurento media server and receive that audio stream at point B with gstreamer. what i trying to achieve should look like this:

(POINT A)----SEND AUDIO STREAM WITH GSTREAMER--->(KURENTO)----AUDIO STREAM----->(POINT B)---GET THE AUDIO WITH GSTREMAER----!

so far i wrote the code bellow:

function createOutGoingAudioStream() {

var sdpOffer = " v=0\r\n"
        + "o=- 0 0 IN IP4 0.0.0.0\r\n"
        + "c=IN IP4 0.0.0.0\r\n"
        + "t=0 0\r\n"
        + "m=audio 5005 RTP/AVP 0\r\n"
        + "a=rtpmap:0 PCMU/8000\r\n";

var pipeline;   
console.log();  
console.log("Starting Audio Stream from Command Post.....");    

// get kurento client
    getKurentoClient(function(error, kurentoClient) {
        if (error) {
            return callback(error);
        }


    // create media pipe line
        kurentoClient.create('MediaPipeline', function(error, pipeline) {
            if (error) {
                    return callback(error);
            }

            // create first rtpEndpoint for the incoming audio stream    
        pipeline.create('RtpEndpoint', function(error, rtpEndpoint) {
                if (error) {
                    pipeline.release();
                return callback(error);
                }
            console.log('audio RTP Endpoint created successfully!');

            rtpEndpoint.processOffer(sdpOffer, function(error, sdpAnswer) {
                            if (error) {
                                    pipeline.release();
                                    return callback(error);
                            }
                console.log(sdpAnswer);
                console.log();
                        // Start a gstreamer audio stream over the audio port that we got from the kurento server
                        var jsonSdpAnswer = transform.parse(sdpAnswer);
                        var port = jsonSdpAnswer.media[0].port;

                console.log("Starting audio stream to the kurento server: ");
                                    console.log('sh gstreamer.sh ' + port +  ' > log.txt')

                exec('sh gstreamer.sh ' + port + ' > log.txt', function(err, stdout, stderr) {
                            if (err) {
                                    console.error(err);
                                    return;
                            }
                        //if all is ok nothing wil prompt to the console
                        console.log(stdout);
                        });
            });

            // create second rtpEndpoint for the outgoing to the odroid's audio stream    
                        pipeline.create('RtpEndpoint', function(error, outRtpEndpoint) {
                                if (error) {
                                        pipeline.release();
                                        return callback(error);
                                }
                                console.log('second RTP Endpoint created successfully!');


                rtpEndpoint.connect(outRtpEndpoint, function(error){
                        if(error) return onError(error);
                });
                outRtpEndpoint.generateOffer(function(error,offerSdp){
                    if(error) return onError(error);
                    console.log("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")
                    console.log(offerSdp);
                });
                        });
        });
    });
});
}

I get from the kurento server the sdpOffer of outRtpEndpoint and it looks like this:

sdp Offer

doesn't matter what i am trying to do in order to listen to that stream it just doesn't want to work. what am i doing wrong ?

I would really appreciate any help.

Thanks !!!


Solution

  • I was able to kind of solve the issue. I get the source audio stream from the browser(webrtcEndpoint) at point A and connect that endpoint to rtpEndpoint and from there i get the stream to point B. (Point A - web browser -> webrtcEndpoint) -> (Kurento -> rtpEndpoint) -> (Point B - ffplay) .

    function createOutGoingAudioStream(sessionId,ws, sdpOffer, callback){
    if (!sessionId) {
        return callback('Cannot use undefined sessionId');
    }
    
    getKurentoClient(function(error, kurentoClient) {
        if (error) {
            return callback(error);
        }
    
        kurentoClient.create('MediaPipeline', function(error, pipeline) {
            if (error) {
                return callback(error);
            }
    
            createMediaElements(pipeline, ws, function(error, webRtcEndpoint) {
                if (error) {
                    pipeline.release();
                    return callback(error);
                }
    
                if (candidatesQueue[sessionId]) {
                   while(candidatesQueue[sessionId].length) {
                        var candidate = candidatesQueue[sessionId].shift();
                        webRtcEndpoint.addIceCandidate(candidate);
                    }
                }
    
                connectMediaElements(webRtcEndpoint, function(error) {
                   if (error) {
                        pipeline.release();
                        return callback(error);
                    }
    
                    webRtcEndpoint.on('OnIceCandidate', function(event) {
                        var candidate = kurento.getComplexType('IceCandidate')(event.candidate);
                       ws.send(JSON.stringify({
                           id : 'iceCandidate',
                            candidate : candidate
                        }));
                    });
    
                    webRtcEndpoint.processOffer(sdpOffer, function(error, sdpAnswer) {
                        if (error) {
                            pipeline.release();
                            return callback(error);
                        }
    
                        sessions[sessionId] = {
                            'pipeline' : pipeline,
                            'webRtcEndpoint' : webRtcEndpoint
                        }
                        return callback(null, sdpAnswer);
                    });
    
                    webRtcEndpoint.gatherCandidates(function(error) {
                        if (error) {
                            return callback(error);
                        }
    
    
    
                                var sdp = 'v=0';
                                sdp += '\nc=IN IP4 IP_WHERE_YOU_WANT_TO_GET_THE_STREAM'; // this is the ip where the kurento should stream to
                                sdp += '\nm=audio 8080 RTP/AVP 0'; // at port 8080 you will have an audio stream
                                sdp += '\na=rtpmap:0 PCMU/8000';
                                sdp += '\nm=video 9090 RTP/AVP 101'; // at port 9090 you will have a video stream 
                                sdp += '\na=rtpmap:101 H264/90000';
    
                                pipeline.create('RtpEndpoint', function(err, rtpEndpoint){
                                rtpEndpoint.processOffer(sdp, function(error, sdpAnswer) {
                                        if (error) {
                                                return callback(error);
                                        }
    
                    console.log("################################################");
                    console.log(sdpAnswer);
                    console.log("################################################");
                                 });
    
    
                webRtcEndpoint.connect(rtpEndpoint, function(err, rtpEndpoint) { if(err) { console.log("Error!"); } });
                                });
    
           });
                });
            });
        });
    });
    }
    

    At the computer that you streamed to, you can listen to the stream with:

    ffplay  rtp://IP_FROM_THE_SDP_OFFER_IN_THE_CODE_ABOVE:AUDIO_PORT_FROM_THE_SDP_OFFER_FROM_THE_CODE_ABOVE