注:最新の編集を確認してください
エッジで次の警告が表示されます。
Timeout for addRemoteCandidate. Consider sending an end-of-candidates notification
これを修正する方法がわかりません。私は adapter.js を使用していますが、人々がこの問題について話しているスレッドを見つけました。しかし、修正は機能しません。
を追加しようとしましpc.addIceCandidate(null)
たが、何もしません。
checking
Chrome では動作し、ICE の状態は非常にconnected
高速になります。
エッジで ICE 状態がハングアップし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
。else if 条件に追加しようとし
|| candidate.candidate == undefined
ましたが、それでも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({""});
Edge のMicrosoft ドキュメントから:
リモート RTCIceGatherer が最終候補を送信する場合、ローカル RTCIceTransport が予想されるリモート候補がこれ以上ないことを認識し、「完了」状態に入ることができるように、RTCIceCandidateComplete 辞書を引数として addRemoteCandidate() を呼び出す必要があります。
私は試した:
pc.transceivers[j].iceTransport.addRemoteCandidate(new RTCIceCandidateComplete({complete:true}));
pc.transceivers[j].iceTransport.addRemoteCandidate({complete:true});
最初のものは私に与えます:
RTCIceCandidateComplete is not defined