Почему "onicecandidate" не работает?
У меня проблемы с пониманием webRTC с его событием PeerConnection и onicecandidate.
Насколько я понимаю, вы должны инициировать одноранговое соединение с использованием сервера STUN (или TURN), потому что оно отправит вас обратно вашему кандидату ICE для связи с другим узлом.
Я видел примеры, в которых параметр сервера объекта PeerConnection был пропущен, чего я тоже не понимаю, но давайте просто скажем, что для этого нужен параметр сервера.
Итак, когда я записываю следующий код:
var pc, ice = { "iceServers": [{ "url": "stun:stun.l.google.com:19302" }] };
if(typeof mozRTCPeerConnection === 'function') {
pc = new mozRTCPeerConnection(ice);
}
else {
console.log('google');
pc = new webkitRTCPeerConnection(ice);
}
pc.onicecandidate = function(event) {
console.log(event);
}
Я ожидаю, что событие onicecandidate сработает, но это не сработает. Я пробовал и другие общедоступные серверы STUN, но ничего не происходит. Поэтому я предполагаю, что, возможно, что-то не так с моим пониманием:)
1 ответ
PeerConnection не начнет собирать кандидатов, пока вы не вызовете setLocalDescription(); информация, предоставленная setLocalDescription, сообщает PeerConnection, сколько кандидатов необходимо собрать. (Такое поведение для setLocalDescription указано в его определении по адресу http://tools.ietf.org/html/draft-ietf-rtcweb-jsep-03)
Вот как выглядит полный поток для установления соединения между двумя PeerConnections в одном окне браузера (добавление MediaStreams опущено, чтобы сосредоточиться на передаче сигналов):
var pc1, pc2, offer, answer;
pc1 = new webkitRTCPeerConnection(options);
pc2 = new webkitRTCPeerConnection(options);
pc1.onicecandidate = function(candidate) {
pc2.addIceCandidate(candidate);
};
pc2.onicecandidate = function(candidate) {
pc1.addIceCandidate(candidate);
};
pc1.createOffer(onOfferCreated, onError);
function onError(err) {
window.alert(err.message);
}
function onOfferCreated(description) {
offer = description;
pc1.setLocalDescription(offer, onPc1LocalDescriptionSet, onError);
}
function onPc1LocalDescriptionSet() {
// after this function returns, pc1 will start firing icecandidate events
pc2.setRemoteDescription(offer, onPc2RemoteDescriptionSet, onError);
}
function onPc2RemoteDescriptionSet() {
pc2.createAnswer(onAnswerCreated, onError);
}
function onAnswerCreated(description) {
answer = description;
pc2.setLocalDescription(answer, onPc2LocalDescriptionSet, onError);
}
function onPc2LocalDescriptionSet() {
// after this function returns, you'll start getting icecandidate events on pc2
pc1.setRemoteDescription(answer, onPc1RemoteDescriptionSet, onError);
}
function onPc1RemoteDescriptionSet() {
window.alert('Yay, we finished signaling offers and answers');
}
Поскольку вы включили mozPeerConnection в свой вопрос, я отмечу, что Firefox в настоящее время не генерирует "подходящих кандидатов". Это означает, что он будет включать адреса-кандидаты в виде строк 'c' в предложении / ответе, и обратный вызов onicecandidate никогда не будет вызываться.
Недостатком этого подхода является то, что Firefox должен дождаться сбора всех своих кандидатов, прежде чем создавать свое предложение / ответ (процесс, который может включать в себя обращение к серверам STUN и TURN и ожидание ответов или тайм-аута запросов).