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