запустить событие onicecandidate после получения ответа - PullRequest
0 голосов
/ 29 марта 2019

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

peerConn.onicecandidate = function (event) {
    if (event.candidate) {
        let candidate = new RTCIceCandidate(event.candidate) 
        // Send the -candidate -  to the remote peer
        } else {
    console.log('all candidates are set');
    }
 }

и это:

function obtainCandidatesFromSignalServer (){
     console.log('obtain candidates ...');
     peerConn.addIceCandidate(candidate);
 }

Я ожидаю, что событие будет вызвано после обмена одноранговым узлом A и одноранговым B offer и answer, но это не так. Когда я просто отправляю offer из A в B, запускается событие onicecandidate, но до тех пор, пока одноранговый узел B не отправит answer, функция receiveCandidatesFromSignalServer завершится ошибкой. Итак, как я могу вызвать функцию onicecandidate только после offer - answer exchange?

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

Я ожидаю, что событие будет вызвано после предложения и ответа обмена между узлом A и узлом B, но это не так.

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

Другими словами, то, что вы увидите на своем сигнальном канале одним способом:

offer candidate candidate candidate

... и то же самое происходит в другом направлении:

answer candidate candidate candidate

Думайте о них как об обновлениях отправленного описания. На самом деле, если вы должны были подождать несколько секунд, прежде чем отправить pc.localDescription, тогда описание уже будет содержать всех кандидатов, и вам не нужно их обменивать. Trickle ICE - это оптимизация, поскольку время подключения обычно очень важно.

0 голосов
/ 29 марта 2019

Какую ошибку вы получаете? Мне никогда не приходилось устанавливать onicecandidate в определенное время.

Я подозреваю, что ошибка в другом: почему вы создаете new RTCIceCandidate(event.candidate), когда event.candidate уже является экземпляром RtcIceCandidate (см. https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnectionIceEvent/candidate)? Я предполагаю, что при вызове нового RtcIceCandidate вы создаете недопустимый кандидат и отправка этого другому пиру, таким образом, ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...