2013-03-18 35 views
12

Tôi đang gặp sự cố khi hiểu webRTC với sự kiện PeerConnection và 'onicecandidate'.tại sao không "onicecandidate" làm việc?

Theo tôi hiểu, bạn phải bắt đầu kết nối ngang bằng máy chủ STUN (hoặc TURN), vì nó sẽ gửi lại cho bạn ứng viên ICE để liên lạc với một người khác.

Tôi đã xem các ví dụ để lại thông số máy chủ của đối tượng PeerConnection, điều mà tôi cũng không hiểu, nhưng chúng ta hãy nói rằng nó cần tham số máy chủ.

Vì vậy, khi tôi viết ra đoạn mã sau:

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

tôi hy vọng rằng sự kiện 'onicecandidate' sẽ cháy, nhưng nó không hoạt động. Tôi đã thử các máy chủ STUN công cộng khác, nhưng không có gì xảy ra. Vì vậy, tôi cho rằng có thể có điều gì đó sai trái với hiểu biết của tôi :)

+0

Tôi không chắc chắn, tại sao tôi viết nó như một bình luận, nhưng tôi nghĩ rằng bạn phải chạy pc.createOffer khi xử lý sự kiện được thiết lập để thực sự tạo ra một ứng cử viên. –

+0

Cảm ơn Andreas, tôi sẽ cố gắng chắc chắn. Sau khi đọc hướng dẫn 'Bắt ​​đầu với WebRTC' trên htmlRocks, tôi kết luận rằng việc thu thập các ứng cử viên ICE và thông tin SDP là các quy trình độc lập và bắt buộc để có được luồng từ xa, nhưng bạn có thể ở ngay đó. – Fab

+0

Có thể trùng lặp của [WebRTC không bao giờ kích hoạt onIceCandidate] (https://stackoverflow.com/questions/27489881/webrtc-never-fires-onicecandidate) – Qix

Trả lời

19

PeerConnection sẽ không bắt đầu thu thập các ứng viên cho đến khi bạn gọi setLocalDescription(); thông tin được cung cấp cho setLocalDescription cho PeerConnection biết cần phải thu thập bao nhiêu ứng cử viên. (Hành vi này cho setLocalDescription được nêu trong định nghĩa của nó tại http://tools.ietf.org/html/draft-ietf-rtcweb-jsep-03#section-4.2.4)

Đây là những gì một dòng chảy hoàn toàn trông giống như cho việc thiết lập một kết nối giữa hai PeerConnections trong cửa sổ trình duyệt tương tự (thêm của MediaStreams bỏ qua để tập trung vào các tín hiệu):

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

Vì bạn đã bao gồm mozPeerConnection trong câu hỏi của mình, tôi sẽ lưu ý rằng Firefox hiện không tạo 'ứng viên nhỏ'. Điều này có nghĩa là nó sẽ bao gồm các địa chỉ ứng cử viên của nó dưới dạng các dòng 'c' trong phiếu mua hàng/trả lời và cuộc gọi lại onicecandidate sẽ không bao giờ được gọi. Nhược điểm của phương pháp này là Firefox phải đợi cho tất cả các ứng viên của nó được thu thập trước khi tạo ra các câu trả lời (một quá trình có thể liên quan đến các máy chủ STUN và TURN và chờ phản hồi hoặc yêu cầu thời gian chờ).).

+0

Cảm ơn bạn đã giải thích! Nó bắt đầu có ý nghĩa hơn bây giờ. – Fab

+3

Điều này vẫn không gọi onicecandidate. – kennysong

+0

Đối với tôi nữa. Có lẽ vì cả hai kênh đều ở cùng một phía? – zim32

Các vấn đề liên quan