WebRTC在本地工作,但不能跨越不同的IP地址

我的代码在Github上: https : //github.com/rashadrussell/webrtc_experiment/blob/master/public/script.js

我正在尝试使用WebRTC编写1对1video会议脚本。 并存储在云托pipe网站AppFog上。 当我在一台计算机上testing两个不同的Chrome窗口时,它在我的本地主机上工作。 它也适用于AppFog,当我在家中的两台不同的计算机上testing它时。

当我testing我的应用程序与一个住在另一个房子的朋友时,会出现问题。 远程stream没有被设置。 我唯一的猜测是,IP地址有一些错误,这意味着我的寒冰候选人的设置是错误的。 所有popup的是远程stream应该是的黑盒子。

这是我的一些代码:

**Client-Side** var isInitiator = false; socket.on('initiatorFound', function(data) { isInitiator = data.setInitiator; console.log("Is Initiator? " + isInitiator); }); navigator.getMedia = ( navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia ); navigator.getMedia( {video: true, audio: false}, function(stream) { var video = document.getElementById("localView"); video.src = window.URL.createObjectURL(stream); console.log("Add Stream"); sendMessage('streamAdd', {streamAdded: 'stream-added'}); createPeerConnection(); pc.addStream(stream); if(isInitiator) { callPeer(); } }, function(err) { console.log("The following error occured: "); console.dir(err); } ); function sendMessage(type, message) { console.log("Sending Message"); socket.emit('message',{ "type": type, "message": message }); } function createPeerConnection() { pc = new rtcPeerConnection(servers, options); console.dir(pc); pc.onicecandidate = function(evt) { if(evt.candidate == null) return; pc.onicecandidate = null; console.log("Send Ice Candidate"); sendMessage("iceCandidate", JSON.stringify(evt.candidate)); }; pc.onaddstream = function(evt) { document.body.append("<video id='remoteVideo' autoplay></video>"); var remoteVid = document.getElementById("remoteVideo"); remoteVid.src = window.URL.createObjectURL(evt.stream); }; } function callPeer() { pc.createOffer(function (offer) { pc.setLocalDescription(offer, function() { sendMessage("offer", JSON.stringify(offer)); }); console.log("Send Offer"); }, function(err) { console.log("Offer Error: " + err) }, videoConstraints ); } function answerPeer() { pc.createAnswer(function(answer) { pc.setLocalDescription(answer); sendMessage("answer", JSON.stringify(answer)) }, function(err) { console.log("Sending Answer Error: " + err) }, videoConstraints ); } socket.on('message', function(message) { console.log("CONSOLE MESSAGE:"); console.dir(message); if(message.type == 'streamAdd') { console.log('Stream was added'); createPeerConnection(); if(isInitiator) { callPeer(); } } else if(message.type == 'offer') { pc.setRemoteDescription( new rtcSessionDescription(JSON.parse(message.message))); if(!isInitiator) { console.log("Sending Answer"); answerPeer(); } } else if(message.type == 'answer') { pc.setRemoteDescription( new rtcSessionDescription(JSON.parse(message.message))); } else if(message.type == 'iceCandidate') { console.log("Get Ice Candidate"); pc.addIceCandidate(new rtcIceCandidate(JSON.parse(message.message)) ); } }); 

服务器端

 var isInitiator = false; io.sockets.on('connection', function(socket) { if (!isInitiator) { isInitiator = true; socket.emit('initiatorFound', {setInitiator: isInitiator}); } else { socket.emit('initiatorFound', {setInitiator: !isInitiator}); } // Signaling Channel socket.on('message', function(message) { if (message.type == 'streamAdd') { console.log('Got message: ' + message); } //socket.emit('message' ,message); // Should be: socket.broadcast.emit('message', message); }); }); 

在线

pc = new rtcPeerConnection(servers,options);

在通过服务器variables发送服务器信息时,需要提及TURN服务器的addr以及STUN服务器。 通常情况下,由于NAT或防火墙的原因,数据会被阻塞,在这种情况下TURN应该有所帮助

有关更多服务器的详细信息,可以查看https://gist.github.com/yetithefoot/7592580