DOMException: impossible de définir la distance offre sdp: Appelé en mauvais état: STATE_SENTOFFER
Je suis en train de faire un appel vidéo de l'application web à l'aide de webRTC. Je suis en utilisant angularjs et de l'exprimer.io
J'obtiens cette erreur:
DOMException: impossible de définir la distance offre sdp: Appelé en mauvais état: STATE_SENTOFFER
Certains de mon code est:
//in controller (socket is already defined in controller)
var videolocal = document.getElementById('videolocal');
var videoremote = document.getElementById('videoremote');
var streamlocal = null;
var pc = null;
window.URL = window.URL || window.webkitURL;
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
var configuration = {'iceServers': [
//{'url': 'stun:stun.services.mozilla.com'},
{'url': 'stun:stun.l.google.com:19302'}
]};
//run start(true) to initiate a call
$scope.start = function() {
console.log('start');
//get the local stream, show it in the local video element and send it
navigator.getUserMedia({ "audio": true, "video": true }, function (stream) {
videolocal.src = URL.createObjectURL(stream);
pc = new RTCPeerConnection(configuration);
pc.addStream(stream);
//once remote stream arrives, show it in the remote video element
pc.onaddstream = function (evt) {
console.log('onaddstream');
videoremote.src = URL.createObjectURL(evt.stream);
};
//send any ice candidates to the other peer
pc.onicecandidate = function (evt) {
console.log('onicecandidate');
if(evt.candidate){
socket.emit('video_call',{user:2, type: 'candidate', candidate: evt.candidate});
}
};
//create an offer
pc.createOffer(function (offer) {
socket.emit('video_call', {user:2, type: "offer", offer: offer});
pc.setLocalDescription(offer);
}, function (error) {
alert("Error when creating an offer");
});
}, function () {alert('error in start')});
}
$scope.start();
socket.on('video_call', function (data) {
console.log(data);
//when somebody sends us an offer
function handleOffer(offer) {
//this line is giving error
pc.setRemoteDescription(new RTCSessionDescription(offer), function(){alert('success')}, function(e){ console.log(e); alert(e)});
//create an answer to an offer
pc.createAnswer(function (answer) {
pc.setLocalDescription(answer);
socket.emit('video_call', {user:2, type: "answer", answer: answer});
}, function (error) {
console.log(error);
alert("Error when creating an answer");
});
};
//when we got an answer from a remote user
function handleAnswer(answer) {
pc.setRemoteDescription(new RTCSessionDescription(answer));
};
//when we got an ice candidate from a remote user
function handleCandidate(candidate) {
pc.addIceCandidate(new RTCIceCandidate(candidate));
};
switch(data['type']) {
case "offer":
handleOffer(data["offer"]);
break;
case "answer":
handleAnswer(data['answer']);
break;
//when a remote peer sends an ice candidate to us
case "candidate":
handleCandidate(data['candidate']);
break;
default:
break;
}
});
Sur le serveur:
//this function is called on video_call event
video_call: function (data) {
var id = data.user;
//if user is active
//users is dict of users (user_id as key)
if(Object.keys(users).indexOf(id.toString()) > -1){
//for each device of the user
users[id].forEach(function(user_socket){
console.log(data);
user_socket.emit('video_call', data);
});
}
}
Merci si quelqu'un peut dire quel est le problème avec ce code. Le cours d'eau local est de capturer correctement. J'utilise chrome navigateur.
De données sur le serveur:
Qu'est-ce que la ligne exacte en JS qui génère cette erreur?
Quand une offre est reçu, cette ligne "pc.setRemoteDescription(nouveau RTCSessionDescription(l'offre), function(){alert('success')}, function(e){ console.log(e); alert(e)});" des alertes (et aussi de l'impression dans la console): DOMException: impossible de définir la distance offre sdp: Appelé en mauvais état: STATE_SENTOFFER. Puis il imprime: Uncaught (promesse) DOMException: Erreur de traitement de la GLACE candidat
Quand une offre est reçu, cette ligne "pc.setRemoteDescription(nouveau RTCSessionDescription(l'offre), function(){alert('success')}, function(e){ console.log(e); alert(e)});" des alertes (et aussi de l'impression dans la console): DOMException: impossible de définir la distance offre sdp: Appelé en mauvais état: STATE_SENTOFFER. Puis il imprime: Uncaught (promesse) DOMException: Erreur de traitement de la GLACE candidat
OriginalL'auteur harish kumar | 2016-06-13
Vous devez vous connecter pour publier un commentaire.
Je pense que le problème est que dans votre
handleOffer()
fonction, vous devez créer un autre PeerConnection et appelsetRemoteDescription()
sur un pc.C'est ce que j'ai dans mon code.
EDIT: Dans le lien officiel vous pouvez aller au chapitre 11.7 et vérifiez les étapes après le 15 (lorsque l'offre est envoyée et l'autre par les pairs le reçoit).
Je ne peux pas partager tout le code car ma société est le propriétaire... Avez-vous changé le
pc.addIceCandidate()
à laremote_pc
? Vous avez besoin de faire la distinction entre ces 2 peerConnections.Comment avez-vous lien remote_pc et videoremote (balise vidéo à distance de l'élément)?
L'événement
onaddstream
reçoit la vidéo à distance. Vous l'avez mis en œuvre.Je n'ai pas vérifié sur différents Pc. Après avoir vérifié que je mettrai à jour cette réponse avec un code complet. Merci pour l'aide.
OriginalL'auteur Samuel Méndez