21

PeerConnection と 'onececandidate' イベントで webRTC を理解するのに問題があります。

私が理解している限りでは、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);
}

「onececandidate」イベントが発生することを期待していますが、機能しません。他のパブリック STUN サーバーも試しましたが、何も起こりません。だから私はおそらく私の理解に何か問題があると思います:)

4

1 に答える 1

36

setLocalDescription(); を呼び出すまで、PeerConnection は候補の収集を開始しません。setLocalDescription に提供される情報は、収集する必要がある候補の数を PeerConnection に通知します。( setLocalDescription のこの動作は、https://datatracker.ietf.org/doc/html/draft-ietf-rtcweb-jsep-03#section-4.2.4の定義に示されています)

同じブラウザ ウィンドウで 2 つの 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 サーバーへの接続と、応答または要求のタイムアウトのいずれかの待機が含まれる可能性があります)。

于 2013-03-19T17:10:10.120 に答える