WebRTC:一对一音频通话在不同的机器上无法使用。

问题描述 投票:2回答:1

我正试图使用webRTC实现一对一的音频通话(使用websockets进行信号传输)。 但它的工作原理是,当我在一个系统中尝试使用多个chrome标签(本地主机)。当我试图从另一台机器打我的服务器,它做了初始握手,但呼叫不会发生。

但是,当我试图改变标签,并改变了约束条件的视频约束.它的工作原理,即使我们尝试从其他机器访问(即视频通话工程)。

我最初认为这是因为如果防火墙,但当视频通话工作,我很困惑。

这是我的代码。

// Constraints to get audio stream only
$scope.constraints = {
    audio: {
            mandatory: {
                googEchoCancellation: true
            },
            optional: []
        },
    video:false
};

navigator.getUserMedia = navigator.getUserMedia ||
    navigator.webkitGetUserMedia || navigator.mozGetUserMedia;

// success Callback of getUserMedia(), stream variable is the audio stream.
$scope.successCallback = function (stream) {
    if (window.URL) {
        myVideo.src = window.URL.createObjectURL(stream); // converting media stream to Blob URL.
    } else {
        myVideo.src = stream;
    }
    //attachMediaStream(audioTag, stream);
    localStream = stream;
    if (initiator)
        maybeStart();
    else
        doAnswer();
};

// failure Callback of getUserMedia()
$scope.failureCallback = function (error) {
    console.log('navigator.getUserMedia Failed: ', error);
};
var initiator, started = false;

 $("#call").click(function () {
    socket.emit("message", undefined);
    initiator = true;
    navigator.getUserMedia($scope.constraints, $scope.successCallback, $scope.failureCallback);
});

var channelReady = false;
socket.on('message', function (data) {
    channelReady = true;
    if (data) {
        if (data.type === 'offer') {
            if (!initiator) {
                $("#acceptCall").show();
                  $("#acceptCall").click(function(){
                      if (!initiator && !started) {
                    var pc_config = {
                        iceServers: [
                     { url: "stun:stun.l.google.com:19302" },
                      { url: "turn:numb.viagenie.ca", credential: "drfunk", username: "[email protected]"}
                     ]
                    };
                    pc = new webkitRTCPeerConnection(pc_config);
                    pc.onicecandidate = onIceCandidate;
                    pc.onaddstream = onRemoteStreamAdded;
                }
                pc.setRemoteDescription(new RTCSessionDescription(data));
                      $scope.acceptCall();
                  });

            }
        } else if (data.type === 'answer' && started) {
            pc.onaddstream = onRemoteStreamAdded;
            pc.setRemoteDescription(new RTCSessionDescription(data));

        } else if (data.type === 'candidate' && started) {
            var candidate = new RTCIceCandidate({
                sdpMLineIndex: data.label,
                candidate: data.candidate
            });
            pc.addIceCandidate(candidate);
        } else if (data.type === 'bye' && started) {
            console.log("Bye");
        }
    }
});

 function onRemoteStreamAdded(event) {
    othersVideo.src = URL.createObjectURL(event.stream); 
 };
  var sdpConstraints = {
   'mandatory': {
     'OfferToReceiveAudio': true,
     'OfferToReceiveVideo': false
   }
 };
function doAnswer() {
    pc.addStream(localStream);
    pc.createAnswer(gotDescription,null,sdpConstraints);
}
function gotDescription(desc) {
        pc.setLocalDescription(desc);
        socket.send(desc);
    }

function maybeStart() {
    if (!started && localStream && channelReady)
        createPeerConnection();
        pc.addStream(localStream);
        started = true;
        if (initiator)
            doCall();
    }

$scope.acceptCall = function () {
    navigator.getUserMedia($scope.constraints, $scope.successCallback, $scope.failureCallback);
}

function createPeerConnection() {
    var pc_config = {
         iceServers: [
         { url: "stun:stun.l.google.com:19302" },
         { url: "turn:numb.viagenie.ca", credential: "drfunk", username: "[email protected]"}
         ]
    };

    pc = new webkitRTCPeerConnection(pc_config);
    pc.onicecandidate = onIceCandidate;
    console.log("Created RTCPeerConnnection with config:\n" + "  \"" +
        JSON.stringify(pc_config) + "\".");
};


function doCall() {
    $scope.caller = true;
    pc.createOffer(setLocalAndSendMessage,null,sdpConstraints);
};

function setLocalAndSendMessage(sessionDescription) {
    pc.setLocalDescription(sessionDescription);
    socket.send(sessionDescription);
}

function onIceCandidate(event) {
    if (event.candidate) {
        socket.emit('message', {
            type: 'candidate',
            label: event.candidate.sdpMLineIndex,
            id: event.candidate.sdpMid,
            candidate: event.candidate.candidate
        });
    } else {
        console.log("End of candidates.");
    }
}
node.js webrtc
1个回答
0
投票

如果navigator.mediaDevices是未定义的,这是因为只在安全上下文中工作(https)。

参见

https:/developer.mozilla.orgen-USdocsWebAPIMediaDevicesgetUserMedia。

© www.soinside.com 2019 - 2024. All rights reserved.