2013-03-18 21 views
12

Mam problemy ze zrozumieniem webRTC z wydarzeniem PeerConnection i "onicecandidate".dlaczego funkcja "onicecandidate" nie działa?

O ile rozumiem, musisz musi zainicjować połączenie równorzędne za pomocą serwera STUN (lub TURN), ponieważ odeśle on twojego kandydata na ICE do komunikacji z innym partnerem.

Widziałem przykłady pozostawiając parametr serwera obiektu PeerConnection, którego nie rozumiem, ale powiedzmy, że potrzebuje parametru serwera.

Tak więc, gdy piszę następujący kod:

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); 
} 

Spodziewam się, że „onicecandidate” zdarzenie będzie ognia, ale to nie działa. Próbowałem także innych publicznych serwerów STUN, ale nic się nie dzieje. Zakładam więc, że prawdopodobnie coś jest nie tak z moim zrozumieniem :)

+0

Nie jestem entierly pewny, dlaczego piszę to jako komentarz, ale myślę, że musisz uruchomić pc.createOffer, gdy procedury obsługi zdarzeń są skonfigurowane tak, aby faktycznie stworzyć kandydata. –

+0

Dzięki Andreas, spróbuję tego na pewno. Po przeczytaniu samouczka "Pierwsze kroki z WebRTC" na temat htmlRocks doszedłem do wniosku, że gromadzenie kandydatów na ICE i informacji SDP to niezależne i obowiązkowe procesy w celu uzyskania zdalnego strumienia, ale możesz być na miejscu. – Fab

+0

Prawdopodobny duplikat [WebRTC nigdy nie uruchamia onIceCandidate] (https://stackoverflow.com/questions/27489881/webrtc-never-fires-onicecandidate) – Qix

Odpowiedz

19

Połączenie PeerConnection nie rozpocznie zbierania kandydatów, dopóki nie wywołasz funkcji setLocalDescription(); informacje dostarczone do setLocalDescription informują PeerConnection, ile kandydatów należy zebrać. (To zachowanie dla setLocalDescription jest wskazany w jej definicji w http://tools.ietf.org/html/draft-ietf-rtcweb-jsep-03#section-4.2.4)

Oto co kompletnym przepływu wygląda na nawiązanie połączenia pomiędzy dwoma PeerConnections w tym samym oknie przeglądarki (dodawanie MediaStreams pominiętych skupić się na sygnalizacji):

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'); 
} 

Ponieważ w pytaniu uwzględniono komunikat mozPeerConnection, zauważę, że Firefox obecnie nie generuje "dokładnych kandydatów". Oznacza to, że będzie zawierać swoje kandydujące adresy jako linie "c" w ofercie/odpowiedzi, a wywołanie zwrotne onicecandidate nigdy nie zostanie wywołane.

Wadą takiego podejścia jest to, że Firefox musi czekać na zgromadzenie wszystkich swoich kandydatów przed stworzeniem swojej oferty/odpowiedzi (proces, który może obejmować kontakt z serwerami STUN i TURN i oczekiwanie na odpowiedzi lub na żądanie limitu czasu)).

+0

Dziękuję za wyjaśnienie! Teraz zaczyna mieć więcej sensu. – Fab

+3

To nadal nie powoduje połączenia z onicecandidate. – kennysong

+0

Dla mnie też. Może dlatego, że oba kanały są po tej samej stronie? – zim32