WebRTC对等连接:使用哪一个候选集的IP流?

WebRTC对等连接:使用哪一个候选集的IP流?,ip,webrtc,flow,sdp,Ip,Webrtc,Flow,Sdp,我目前正在为webrtc会话开发一个监视工具,用于调查从呼叫者到被呼叫者以及从被呼叫者到被呼叫者的SDP传输。不幸的是,我无法确定哪个ip流是真正使用的,因为每个会话建立都有>10个候选行,而且会话是在一些候选行被推到PC内部之后建立的 有没有办法确定候选流集中使用了哪个流?我自己解决了这个问题!:) 有一个名为peerConnection.getStats(回调)的函数 这将提供大量正在进行的对等连接的信息 例如: W3C标准说明: 再见我想知道同样的事情,所以写了一个小函数,它返回一个承

我目前正在为webrtc会话开发一个监视工具,用于调查从呼叫者到被呼叫者以及从被呼叫者到被呼叫者的SDP传输。不幸的是,我无法确定哪个ip流是真正使用的,因为每个会话建立都有>10个候选行,而且会话是在一些候选行被推到PC内部之后建立的


有没有办法确定候选流集中使用了哪个流?

我自己解决了这个问题!:)

有一个名为peerConnection.getStats(回调)的函数

这将提供大量正在进行的对等连接的信息

  • 例如:
  • W3C标准说明:

再见

我想知道同样的事情,所以写了一个小函数,它返回一个承诺,承诺解决候选人的细节:

function getConnectionDetails(peerConnection){


  var connectionDetails = {};   // the final result object.

  if(window.chrome){  // checking if chrome

    var reqFields = [   'googLocalAddress',
                        'googLocalCandidateType',   
                        'googRemoteAddress',
                        'googRemoteCandidateType'
                    ];
    return new Promise(function(resolve, reject){
      peerConnection.getStats(function(stats){
        var filtered = stats.result().filter(function(e){return e.id.indexOf('Conn-audio')==0 && e.stat('googActiveConnection')=='true'})[0];
        if(!filtered) return reject('Something is wrong...');
        reqFields.forEach(function(e){connectionDetails[e.replace('goog', '')] = filtered.stat(e)});
        resolve(connectionDetails);
      });
    });

  }else{  // assuming it is firefox
    var stream = peerConnection.getLocalStreams()[0];
    if(!stream || !stream.getTracks()[0]) stream = peerConnection.getRemoteStreams()[0];
    if(!stream) Promise.reject('no stream found')
    var track = stream.getTracks()[0];
    if(!track)  Promise.reject('No Media Tracks Found');
    return peerConnection.getStats(track).then(function(stats){
        var selectedCandidatePair = stats[Object.keys(stats).filter(function(key){return stats[key].selected})[0]]
          , localICE = stats[selectedCandidatePair.localCandidateId]
          , remoteICE = stats[selectedCandidatePair.remoteCandidateId];
        connectionDetails.LocalAddress = [localICE.ipAddress, localICE.portNumber].join(':');
        connectionDetails.RemoteAddress = [remoteICE.ipAddress, remoteICE.portNumber].join(':');
        connectionDetails.LocalCandidateType = localICE.candidateType;
        connectionDetails.RemoteCandidateType = remoteICE.candidateType;
        return connectionDetails;
    });

  }
}