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
Post a Comment