javascript - Codelab(bitbucket.org) example step 6, not working across network -


i reposting question didn't working solution previously. sorry inconvenience caused. have hosted example (basic video chat application use node.js signalling) shown in step 6 of codelab webrtc demo tutorials on heroku try using across different networks. using xirsys stun/turn servers it. works fine when 2 systems on same network. when try connecting systems across different network, shows black screen on remote video. unable figure out problem here. attaching code main.js .any appreciated.

'use strict';  var ischannelready; var isinitiator = false; var isstarted = false; var localstream; var pc; var remotestream; var turnready;  var pc_config = {'iceservers': [ {url:'stun:turn02.uswest.xirsys.com'}, {     url: 'turn:turn02.uswest.xirsys.com:443?transport=udp',     credential: 'my_credentials',     username: 'my_username' }, {     url: 'turn:turn02.uswest.xirsys.com:443?transport=tcp',     credential: 'my_credentials',     username: 'my_username' }, {     url: 'turn:turn02.uswest.xirsys.com:5349?transport=udp',     credential: 'my_credentials',     username: 'my_username' }, {     url: 'turn:turn02.uswest.xirsys.com:5349?transport=tcp',     credential: 'my_credentials',     username: 'my_username' }  ]};  var pc_constraints = {'optional': [{'dtlssrtpkeyagreement': true}]};  // set audio , video regardless of devices present. var sdpconstraints = {'mandatory': {   'offertoreceiveaudio':true,   'offertoreceivevideo':true }};  /////////////////////////////////////////////  var room = location.pathname.substring(1); if (room === '') {  room = prompt('enter room name:');   // room = 'fool'; } else {   // }  var socket = io.connect();  if (room !== '') {   console.log('create or join room', room);   socket.emit('create or join', room); }  socket.on('created', function (room){   console.log('created room ' + room);   isinitiator = true; });  socket.on('full', function (room){   console.log('room ' + room + ' full'); });  socket.on('join', function (room){   console.log('another peer made request join room ' + room);   console.log('this peer initiator of room ' + room + '!');   ischannelready = true; });  socket.on('joined', function (room){   console.log('this peer has joined room ' + room);   ischannelready = true; });  socket.on('log', function (array){   console.log.apply(console, array); });  ////////////////////////////////////////////////  function sendmessage(message){   console.log('client sending message: ', message);   // if (typeof message === 'object') {   //   message = json.stringify(message);   // }   socket.emit('message', message); }  socket.on('message', function (message){   console.log('client received message:', message);   if (message === 'got user media') {     maybestart();   } else if (message.type === 'offer') {     if (!isinitiator && !isstarted) {       maybestart();     }     pc.setremotedescription(new rtcsessiondescription(message));     doanswer();   } else if (message.type === 'answer' && isstarted) {     pc.setremotedescription(new rtcsessiondescription(message));   } else if (message.type === 'candidate' && isstarted) {     var candidate = new rtcicecandidate({       sdpmlineindex: message.label,       candidate: message.candidate     });     pc.addicecandidate(candidate);   } else if (message === 'bye' && isstarted) {     handleremotehangup();   } });  ////////////////////////////////////////////////////  var localvideo = document.queryselector('#localvideo'); var remotevideo = document.queryselector('#remotevideo');  function handleusermedia(stream) {   console.log('adding local stream.');   localvideo.src = window.url.createobjecturl(stream);   localstream = stream;   sendmessage('got user media');   if (isinitiator) {     maybestart();   } }  function handleusermediaerror(error){   console.log('getusermedia error: ', error); }  var constraints = {video: true}; getusermedia(constraints, handleusermedia, handleusermediaerror);  console.log('getting user media constraints', constraints);  // if (location.hostname != "localhost") { //   requestturn('https://computeengineondemand.appspot.com/turn?username=41784574&key=4080218913'); // }  function maybestart() {   if (!isstarted && typeof localstream != 'undefined' && ischannelready) {     createpeerconnection();     pc.addstream(localstream);     isstarted = true;     console.log('isinitiator', isinitiator);     if (isinitiator) {       docall();     }   } }  window.onbeforeunload = function(e){   sendmessage('bye'); }  /////////////////////////////////////////////////////////  function createpeerconnection() {   try {     pc = new rtcpeerconnection(null);     pc.onicecandidate = handleicecandidate;     pc.onaddstream = handleremotestreamadded;     pc.onremovestream = handleremotestreamremoved;     console.log('created rtcpeerconnnection');   } catch (e) {     console.log('failed create peerconnection, exception: ' + e.message);     alert('cannot create rtcpeerconnection object.');       return;   } }  function handleicecandidate(event) {   console.log('handleicecandidate event: ', event);   if (event.candidate) {     sendmessage({       type: 'candidate',       label: event.candidate.sdpmlineindex,       id: event.candidate.sdpmid,       candidate: event.candidate.candidate});   } else {     console.log('end of candidates.');   } }  function handleremotestreamadded(event) {   console.log('remote stream added.');   remotevideo.src = window.url.createobjecturl(event.stream);   remotestream = event.stream; }  function handlecreateoffererror(event){   console.log('createoffer() error: ', e); }  function docall() {   console.log('sending offer peer');   pc.createoffer(setlocalandsendmessage, handlecreateoffererror); }  function doanswer() {   console.log('sending answer peer.');   pc.createanswer(setlocalandsendmessage, null, sdpconstraints); }  function setlocalandsendmessage(sessiondescription) {   // set opus preferred codec in sdp if opus present.   sessiondescription.sdp = preferopus(sessiondescription.sdp);   pc.setlocaldescription(sessiondescription);   console.log('setlocalandsendmessage sending message' , sessiondescription);   sendmessage(sessiondescription); }  function requestturn(turn_url) {   var turnexists = false;   (var in pc_config.iceservers) {     if (pc_config.iceservers[i].url.substr(0, 5) === 'turn:') {       turnexists = true;       turnready = true;       break;     }   }   if (!turnexists) {     console.log('getting turn server ', turn_url);     // no turn server. 1 computeengineondemand.appspot.com:     var xhr = new xmlhttprequest();     xhr.onreadystatechange = function(){       if (xhr.readystate === 4 && xhr.status === 200) {         var turnserver = json.parse(xhr.responsetext);         console.log('got turn server: ', turnserver);         pc_config.iceservers.push({           'url': 'turn:' + turnserver.username + '@' + turnserver.turn,           'credential': turnserver.password         });         turnready = true;       }     };     xhr.open('get', turn_url, true);     xhr.send();   } }  function handleremotestreamadded(event) {   console.log('remote stream added.');   remotevideo.src = window.url.createobjecturl(event.stream);   remotestream = event.stream; }  function handleremotestreamremoved(event) {   console.log('remote stream removed. event: ', event); }  function hangup() {   console.log('hanging up.');   stop();   sendmessage('bye'); }  function handleremotehangup() { //  console.log('session terminated.');   // stop();   // isinitiator = false; }  function stop() {   isstarted = false;   // isaudiomuted = false;   // isvideomuted = false;   pc.close();   pc = null; }  ///////////////////////////////////////////  // set opus default audio codec if it's present. function preferopus(sdp) {   var sdplines = sdp.split('\r\n');   var mlineindex=null;   // search m line.   (var = 0; < sdplines.length; i++) {       if (sdplines[i].search('m=audio') !== -1) {         mlineindex = i;         break;       }   }   if (mlineindex === null) {     return sdp;   }    // if opus available, set default in m line.   (i = 0; < sdplines.length; i++) {     if (sdplines[i].search('opus/48000') !== -1) {       var opuspayload = extractsdp(sdplines[i], /:(\d+) opus\/48000/i);       if (opuspayload) {         sdplines[mlineindex] = setdefaultcodec(sdplines[mlineindex], opuspayload);       }       break;     }   }    // remove cn in m line , sdp.   sdplines = removecn(sdplines, mlineindex);    sdp = sdplines.join('\r\n');   return sdp; }  function extractsdp(sdpline, pattern) {   var result = sdpline.match(pattern);   return result && result.length === 2 ? result[1] : null; }  // set selected codec first in m line. function setdefaultcodec(mline, payload) {   var elements = mline.split(' ');   var newline = [];   var index = 0;   (var = 0; < elements.length; i++) {     if (index === 3) { // format of media starts fourth.       newline[index++] = payload; // put target payload first.     }     if (elements[i] !== payload) {       newline[index++] = elements[i];     }   }   return newline.join(' '); }  // strip cn sdp before cn constraints ready. function removecn(sdplines, mlineindex) {   var mlineelements = sdplines[mlineindex].split(' ');   // scan end convenience of removing item.   (var = sdplines.length-1; >= 0; i--) {     var payload = extractsdp(sdplines[i], /a=rtpmap:(\d+) cn\/\d+/i);     if (payload) {       var cnpos = mlineelements.indexof(payload);       if (cnpos !== -1) {         // remove cn payload m line.         mlineelements.splice(cnpos, 1);       }       // remove cn line in sdp       sdplines.splice(i, 1);     }   }    sdplines[mlineindex] = mlineelements.join(' ');   return sdplines; } 

couple of possibilities. though using stun/turn, maybe firewall still blocking connection somehow?

other idea is, sure webcam on , pointed towards lighted area remote server?

you need post full code.

another possibilities stun/turn not function @ all. might try different stun/turn servers , check locally/other servers besides on heroku, vps can make sure firewalls off.


Comments

Popular posts from this blog

java - Run spring boot application error: Cannot instantiate interface org.springframework.context.ApplicationListener -

python - pip wont install .WHL files -

Excel VBA "Microsoft Windows Common Controls 6.0 (SP6)" Location Changes -