WebRTC на Edge дает "Тайм-аут для addRemoteCandidate. Рассмотрите возможность отправки уведомления о конце кандидатов"

ПРИМЕЧАНИЕ: проверьте последнее ИЗМЕНЕНИЕ, пожалуйста

Меня настораживает это предупреждение:

Timeout for addRemoteCandidate. Consider sending an end-of-candidates notification

Не понимаю, как это исправить. Я использую adapter.js и я нашел нить, где люди говорят о проблеме. Но исправить не получается.

Я пытался добавить pc.addIceCandidate(null), но ничего не делает.


На хроме работает, состояние ДВС идет с checking к connected действительно быстро.

На краю висит состояние ДВС checking и через несколько секунд переходит в new, но это не должно быть новым.

РЕДАКТИРОВАТЬ:

Добавление pc.addIceCandidate(null); дает мне 0: InvalidStateError. Состояние до того, как я позвонюpc.addIceCandidate(null); является new.

Я также пробовал использовать pc.addIceCandidate({candidate:''});, но ничего не делает.

Вот соответствующие части кода, в которые я пытаюсь добавить исправление:

function handleIceCandidate(event) {
  console.log('icecandidate event: ', event);
  if (event.candidate) {
    sendMessage([{
      type: 'candidate',
      label: event.candidate.sdpMLineIndex,
      id: event.candidate.sdpMid,
      candidate: event.candidate.candidate
    }, room]);
  } else {
    console.log("state in End of candidates: " + pc.iceConnectionState);
    if (window.navigator.userAgent.indexOf("Edge") > -1 && pc.iceConnectionState == "new") {
      //pc.addIceCandidate(null);
      pc.addIceCandidate({candidate:''});
    }
  }
}

И в вызове сокета:

socket.on('message', function(message) {


  if (message.type === 'candidate' && isStarted) {

    var candidate = new RTCIceCandidate({
      sdpMLineIndex: message.label,
      candidate: message.candidate
    });
    pc.addIceCandidate(candidate);
    console.log("state in socket: " + pc.iceConnectionState);
    if (window.navigator.userAgent.indexOf("Edge") > -1 && pc.iceConnectionState == "new") {
      //pc.addIceCandidate(null);
      pc.addIceCandidate({candidate:''});
    }
  } 
});

РЕДАКТИРОВАТЬ:

Похоже, проблема в adapter.js:

if (!pc._remoteDescription) {
        return reject(makeError('InvalidStateError',
            'Can not add ICE candidate without a remote description'));
      } else if (!candidate || candidate.candidate === '') { 
        for (var j = 0; j < pc.transceivers.length; j++) {
          if (pc.transceivers[j].rejected) {
            continue;
          }
          pc.transceivers[j].iceTransport.addRemoteCandidate({});
          sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);
          sections[j] += 'a=end-of-candidates\r\n';
          console.log("tries to send end of candidates (I added this)");
          pc._remoteDescription.sdp =
              SDPUtils.getDescription(pc._remoteDescription.sdp) +
              sections.join('');
          if (pc.usingBundle) {
            break;
          }
        }
      }

Он должен войти в else if, но никогда этого не происходит. Я пыталсяconsole.log(candidate.candidate) и это показывает мне undefined. Я пробовал добавить|| candidate.candidate == undefined к условиям else if, но все же он не войдет в else if.

На самом деле, уже кажется неправильным модифицировать файл adapter.js. Я также подтвердил, что использую последнюю версию, я понятия не имею, что здесь происходит и почему кажется, что я единственный, у кого эта проблема на грани.

РЕДАКТИРОВАТЬ:

Лучший подход у меня банкомат. используетpc.addIceCandidate(null) только здесь:

function handleIceCandidate(event) {
  console.log('icecandidate event: ', event);
  if (event.candidate) {
    sendMessage([{
      type: 'candidate',
      label: event.candidate.sdpMLineIndex,
      id: event.candidate.sdpMid,
      candidate: event.candidate.candidate
    }, room]);
  } else {
    if (window.navigator.userAgent.indexOf("Edge") > -1) {
      pc.addIceCandidate(null);
    }
  }
}

Это войдет в else if в adapter.js, где он пытается добавить a=end-of-candidates\r\n, но раньше он не работал:

0: InvalidAccessError

Это строка в файле adapter.js:

pc.transceivers[j].iceTransport.addRemoteCandidate({});

Думаю, мне нужно добавить null кандидат здесь, я пробовал разные варианты синтаксиса, но безуспешно:

pc.transceivers[j].iceTransport.addRemoteCandidate(null);
pc.transceivers[j].iceTransport.addRemoteCandidate({candidate:''});
pc.transceivers[j].iceTransport.addRemoteCandidate();
pc.transceivers[j].iceTransport.addRemoteCandidate({""});

Из Microsoft Docu on Edge:

Когда удаленный RTCIceGathere удаляет своего последнего кандидата, addRemoteCandidate() следует вызывать со словарем RTCIceCandidateComplete в качестве аргумента, чтобы локальный RTCIceTransport мог знать, что ожидаемых удаленных кандидатов больше нет, и мог войти в состояние "завершено".

Я попытался:

pc.transceivers[j].iceTransport.addRemoteCandidate(new RTCIceCandidateComplete({complete:true}));
pc.transceivers[j].iceTransport.addRemoteCandidate({complete:true});

Первый дает мне:

RTCIceCandidateComplete is not defined

0 ответов

Другие вопросы по тегам