WebRTC: вызов в неправильном состоянии: STATE_SENTOFFER

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

Uncaught (в обещании) DOMException: ошибка обработки кандидата ICE

Я сделал лог не методом setRemoteDescription:

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

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

OperationError: не удалось установить удаленное предложение sdp: вызвано в неправильном состоянии: STATE_SENTOFFER

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

(извините за мой английский)


ИЗМЕНИТЬ: (включить код)

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

Внутренняя часть — 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);
  }
};

Внешний интерфейс — 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();
  }
};

Весь шрифт: Код взят из этого репозитория github.


person Luís De Marchi    schedule 10.01.2017    source источник
comment
Что делает answerCall()? Обратите внимание, что вы должны setRemoteDescription(offer) до вызова createAnswer(). Предложение является основой для ответа.   -  person jib    schedule 12.01.2017


Ответы (1)


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

Uncaught (в обещании) DOMException: ошибка обработки кандидата ICE

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

Он «не пойман», потому что возвращает обещание, и вам не хватает .catch:

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

OperationError: не удалось установить удаленное предложение sdp: вызвано в неправильном состоянии: STATE_SENTOFFER

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

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

person jib    schedule 10.01.2017
comment
Добавьте, чтобы поймать: addIceCandidate: OperationError: Ошибка обработки кандидата ICE. PS: В том числе источник в теме. - person Luís De Marchi; 11.01.2017
comment
Я обнаружил, что использование localhost работает, ошибки начинаются, когда я пытаюсь подключиться к сети. И обязательно, поскольку SSL-порты освобождены. - person Luís De Marchi; 11.01.2017
comment
@LuísDeMarchi Это говорит о том, что ваши кандидаты на лед запутались. Попробуйте зарегистрировать их на стороне отправителя и получателя консоли. - person jib; 12.01.2017
comment
Большое спасибо, я использовал необработанный API и две библиотеки для webRTC и получил вторую ошибку, я переместил предложение второго партнера на onAnswer, и это решило проблемы. - person jcubic; 09.02.2018