我正在使用WebRTC API在两台运行在Chrome浏览器上的PC之间进行视频通话。我的观察是ICE候选人只有在我连接到互联网时生成,否则不会产生冰候选者。为什么会那样?
连接块
var pc_config = {"iceServers":[]};
pc = new webkitRTCPeerConnection(pc_config);
pc.onicecandidate=function (evt) {
if(evt.candidate){
console.log("Sending candidate to other peer"+evt);
jWebSocketClient.broadcastText("",evt);
}
};
谢谢, Sureshkumar Menon
答案 0 :(得分:6)
据我了解,ICE候选人有四种类型:
如果您没有为您的程序提供任何STUN / TURN地址或者它们无法访问,则唯一可以检索的候选地点是主机地址。请注意,您的本地地址(127.0.0.1)不被视为潜在候选人。 希望它有所帮助。
但是,我并不完全确定您的用例。两台计算机是否在同一本地网络上?如果您的界面已启动,则应至少获得候选主机。我只使用C ++ API,但我不明白为什么它会与Javascript有不同的行为。
答案 1 :(得分:0)
如果我没弄错,ICE候选人是通过联系STUN
服务器创建的,因此您需要互联网连接。这样做是为了将私人地址转换为公共地址,以使您的客户能够连接(并连接)到其他客户端。
答案 2 :(得分:-2)
是的,您必须在PC共享SDP之前连接到互联网。这是因为ICE服务器不在您的本地计算机上,而是在Internet上。 ICE服务器在此行中的WEB RTC中连接:
if (browser === 'firefox') {
PeerConnConfig = {
iceServers: [{
url: "stun:23.21.150.121" // FF doesn't support resolving DNS in iceServers yet
}
]
};
mediaConstraints = {
mandatory: {
OfferToReceiveAudio: true,
OfferToReceiveVideo: true,
MozDontOfferDataChannel: true // Tell FF not to put datachannel info in SDP or chrome will crash
}
};
// FF doesn't expose this yet
MediaStream.prototype.getVideoTracks = function () {
return [];
};
MediaStream.prototype.getAudioTracks = function () {
return [];
};
} else {
PeerConnConfig = {
iceServers: [{
url: "stun:stun.l.google.com:19302"
}
]
};
mediaConstraints = {
mandatory: {
OfferToReceiveAudio: true,
OfferToReceiveVideo: true
},
optional: [{
DtlsSrtpKeyAgreement: true
}
]
};
// API compat for older versions of chrome
if (!MediaStream.prototype.getVideoTracks) {
MediaStream.prototype.getVideoTracks = function () {
return this.videoTracks;
};
MediaStream.prototype.getAudioTracks = function () {
return this.audioTracks;
};
}
if (!PeerConnection.prototype.getLocalStreams) {
PeerConnection.prototype.getLocalStreams = function () {
return this.localStreams;
};
PeerConnection.prototype.getRemoteStreams = function () {
return this.remoteStreams;
};
}
}
我从WEBRTC_SHIM上面删了代码。请特别考虑将ICE服务器定义为:url:“stun:stun.l.google.com:19302”。