2017-01-10 6 views
3

Я следую this tutorial, чтобы сделать простой пример WebRTC. Но удаленное видео не отображается в любом браузере и Chrome не отображается сообщение об ошибке:WebRTC: Вызывается в неправильном состоянии: STATE_SENTOFFER

Uncaught (in promise) DOMException: Error processing ICE candidate

Я сделал журнал не setRemoteDescription метод:

peerConn.setRemoteDescription(new RTCSessionDescription(signal.sdp), function(){ 
     alert('success') 
    }, function(e){ console.log(e); alert(e)}); 

И тогда я получаю следующее сообщение об ошибке:

OperationError: Failed to set remote offer sdp: Called in wrong state: STATE_SENTOFFER

В данном учебном пособии автор утверждает, что он в состоянии сделать все правильно и что ошибка должна быть на моей стороне. Кто-нибудь когда-либо испытывал это?

(жаль мой английский)


EDIT: (Включить код)

Я еще мирянин на эту тему, ссылка учебника цитировал в начале была чистейшей я нашел чтобы начать веселиться. Я помещу источник я думаю, что это важно:

Back-конец - server.js

/** successful connection */ 
wss.on('connection', function (client) { 
    console.log("A new WebSocket client was connected."); 
    /** incomming message */ 
    client.on('message', function (message) { 
    /** broadcast message to all clients */ 
    wss.broadcast(message, client); 
    }); 
}); 
// broadcasting the message to all WebSocket clients. 
wss.broadcast = function (data, exclude) { 
    var i = 0, n = this.clients ? this.clients.length : 0, client = null; 
    if (n < 1) return; 
    console.log("Broadcasting message to all " + n + " WebSocket clients."); 
    for (; i < n; i++) { 
    client = this.clients[i]; 
    // don't send the message to the sender... 
    if (client === exclude) continue; 
    if (client.readyState === client.OPEN) client.send(data); 
    else console.error('Error: the client state is ' + client.readyState); 
    } 
}; 

Front-End - webrtc.js

wsc.onmessage = function (evt) { 
    var signal = null; 
    if (!peerConn) answerCall(); 
    signal = JSON.parse(evt.data); 
    if (signal.sdp) { 
    console.log("Received SDP from remote peer."); 
    peerConn.setRemoteDescription(new RTCSessionDescription(signal.sdp), 
     function(){}, 
     function(e){ console.log(e); 
    }); 
    } 
    else if (signal.candidate) { 
    console.log("Received ICECandidate from remote peer."); 
    peerConn.addIceCandidate(new RTCIceCandidate(signal.candidate)); 
    } else if (signal.closeConnection){ 
    console.log("Received 'close call' signal from remote peer."); 
    endCall(); 
    } 
}; 

Все шрифта: Code taken from this github repository.

+0

Что делает 'answerCall()' do? Обратите внимание, что вы должны 'setRemoteDescription (offer)' * перед вызовом 'createAnswer()'. Предложение является основой для ответа. – jib

ответ

2

Трудно ответить, не видя кода, но у вас есть как минимум две проблемы, судя по t он две ошибки:

Uncaught (in promise) DOMException: Error processing ICE candidate

Это из peerConn.addIceCandidate(candidate) и есть что-то не так с входом кандидата, предполагая, что это неправильно или искажены каким-то образом. Вы должны сигнализировать об этом по сигнальному каналу с peerConn.onicecandidate с другой стороны. Покажите код, если вам нужна дополнительная помощь.

Это «перехватывается», потому что она возвращает обещание, и Вы пропускаете .catch:

peerConn.addIceCandidate(candidate).catch(e => console.log(e)); 

OperationError: Failed to set remote offer sdp: Called in wrong state: STATE_SENTOFFER

Это предполагает оба одноранговых пытались отправить предложение в то же время, что является симметричным и неправильно.

Обмен предложения/ответа по своей сути асимметричен. Одна сторона должна начинаться с предложения, другая сторона получает его, делает SetRemote, createAnswer и отправляет ответ первому партнеру, который устанавливает setRemote. Этот танец - state-machine. Любая ошибка, и вы получите такую ​​ошибку.

+0

Добавить в catch: "addIceCandidate: OperationError: ошибка обработки ICE-кандидата". PS: Включая источник в тему. –

+0

Я обнаружил, что при работе с localhost ошибки начинаются, когда я пытаюсь подключиться к сети. И уверен, что порты SSL будут выпущены. –

+0

@ LuísDeMarchi Это говорит о том, что ваши кандидаты на льду испорчены. Попробуйте записать их на консоль отправителя и получателя. – jib

Смежные вопросы