2013-03-18 27 views
12

PeerConnection ve 'onicecandidate' etkinliği ile webRTC'yi anlamakta sorun yaşıyorum. Başka bir eş ile iletişim için geri ICE adayı göndereceğim çünküneden "onicecandidate" çalışmıyor?

Bildiğim kadarıyla anladığım kadarıyla size zorunluluk, bir STUN (veya TESLİM) sunucusunu kullanarak bir PeerConnection'ı başlatın.

PeerConnection nesnesinin sunucu parametresini dışarıda bıraktığım örnekleri de anladım, ancak sunucu parametresine ihtiyaç duyduğunu söyleyebilirim. Aşağıdaki kodu bir yere not zaman

Yani,:

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

Ben 'onicecandidate' olayı bekliyoruz, ancak çalışmıyor. Diğer halk STUN sunucularını da denedim, ancak hiçbir şey olmuyor. Bu yüzden anladığım kadarıyla yanlış bir şey olduğunu varsayalım :)

+0

Tamamen emin değilim, neden bir yorum olarak yazdım, ancak olay işleyicileri aslında bir aday oluşturmak için kurulduğunda pc.createOffer uygulamasını çalıştırmanız gerektiğini düşünüyorum. –

+0

Teşekkürler Andreas, Bunu kesinlikle deneyeceğim. HtmlRocks ile ilgili 'WebRTC'ye Başlarken' eğitimini okuduktan sonra, ICE adaylarını ve SDP bilgilerinin toplanması, uzak bir akış elde etmek için bağımsız ve zorunlu süreçler olduğu sonucuna vardım, ancak orada olabilirsiniz. – Fab

+0

Olası kopya [WebRTC hiçbir zaman IcceCandidate'de patlamaz] (https://stackoverflow.com/questions/27489881/webrtc-never-fires-onicecandidate) – Qix

cevap

19

PeerConnection, setLocalDescription(); setLocalDescription'a sağlanan bilgiler, PeerConnection'a kaç tane adayın toplanması gerektiğini anlatır.

İşte

aynı tarayıcı penceresinde iki PeerConnections arasında bir bağlantı kurulması için (sinyal odaklanmak ihmal MediaStreams ekleyerek) gibi eksiksiz bir akış nasıl göründüğü ve (setLocalDescription için bu davranış http://tools.ietf.org/html/draft-ietf-rtcweb-jsep-03#section-4.2.4 tanımından belirtilmiştir):

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

Sorunuza bir mozPeerConnection eklediğinizden, Firefox'un şu anda 'damlama adayları' üretmediğine dikkat edeceğim. Bu, aday adreslerini teklif/cevapta 'c' satırı olarak içereceği anlamına gelir ve onicecandidate geri çağrısı hiçbir zaman çağrılmaz.

Bu yaklaşımın olumsuz tarafı, Firefox'un teklif/cevap oluşturmadan önce tüm adaylarının toplanmasını beklemesi gerektiğidir (STUN ve TURN sunucularıyla iletişim kurmayı ve yanıtları veya isteklerin zaman aşımını beklemeyi içeren bir süreç)).

+0

Açıklamanız için teşekkürler! Şimdi daha mantıklı olmaya başladı. – Fab

+3

Bu hala onicecandidate'i çağırmaz. – kennysong

+0

Benim için de. Belki de her iki kanalın aynı tarafta olması nedeniyle? – zim32