Dear, this is the reply of the CreatiFI winner with the info you requested, with also attachments Thanks. **************************************************** Hi, in attach you can find the log you have requested. For the second issue, we have already read the guidance and we have a running environment with an example p2p WebRTC using STUN and TURN. The problem raises using Kurento for mediating the video communication. In the peer webrtc mini-prototype we figured out the architecture, but we do not understand how this has to change using Kurento. I think we all can save time if we can arrange a short CC to discuss the integration of Kurento in the use case. Let me know. Thanks Stefano **************************************************** On Thu, Feb 26, 2015 at 2:00 PM, Andrea Maestrini <amaestrini at create-net.org > wrote: > Dear FIWARE coach, > as you suggested we collect more info from the CreatiFI winner (moreover > they attached configuration files) and we forward you the support > request, we > are not able to solve. > Please let us know if you need direct contact with the submitter. > Thanks. > > ************************************************************** > > We are trying to develop an application with Kurento GE as part of > CREATIFI project. > The application is quite simple for now, but we are facing some technical > issues. > > The application uses SignalMaster as signaling server, and Kurento for > mediating the video communication. > We started with a peer webrtc mini-prototype, and now we are integrating > Kurento … > > Our environment is: > Linux Ubuntu 14.10 > SignalMaster https://github.com/andyet/signalmaster > Kurento Media Server (5.1.0) > Kurento Client Nodejs 5.1.0 > > The code I have so far does … > > - allows two clients to register to a ‘room’ > - when the second enters the room, SDP offers are exchanged (using signal > master functionalities) > - then I try to integrate Kurento in the process to have the media > exchange handled by Kurento but unfortunately, the whole process does not > fulfill because even in a loopback case (clients and servers all running in > same machine)I cannot see the videostream to appear. > > In attachment you find the code excerpts. > I think in this stage of the project it would be great for us to get your > inputs. > > A second design problem which is not clear to us - but we are not yet > there - is the role / configuration of STUN / TURN servers. > In the peer webrtc mini-prototype we figured out the architecture, but we > do not understand how this has to change using Kurento. > > Can you help and help us go in the right direction ? > > best regards > > ************************************************************** > > > > On Wed, Feb 18, 2015 at 1:45 PM, Andrea Maestrini < > amaestrini at create-net.org> wrote: > >> Dear FIWARE coach, >> we forward you a support request received from a CreatiFI Call1 winner, we >> are not able to solve. >> Please let us know if you need direct contact with the submitter. >> Thanks. >> >> **************************************************************** >> General Support #65: Kurento support needed >> <http://techsupport.creatifi.eu/issues/65> >> >> - Author: Stefano Scotton >> - Status: New >> - Priority: High >> - Assignee: Trento Tech Support (Italy&Belgium) >> - Category: Trento Hub (Italy) >> - Support Type: FIWARE Generic Enablers >> >> Hi all, >> we are experiencing the features of Kurento GE but we have trouble >> understanding the documentation aspects of application integration. >> We need the availability of support for discussing of some architectural >> aspects of Kurento GE. >> >> can you provide us a technical reference to talk to these issues? >> >> Thank You >> >> Stefano >> >> **************************************************************** >> > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: <https://lists.fiware.org/private/fiware-creatifi-coaching/attachments/20150302/6869a1ae/attachment.html> -------------- next part -------------- /* global console */ var yetify = require('yetify'), config = require('getconfig'), uuid = require('node-uuid'), crypto = require('crypto'), port = parseInt(process.env.PORT || config.server.port, 10), io = require('socket.io').listen(port); var kurento = require('kurento-client'); /* Kurento */ var kurentoClient = null; var pipelines = {}; var offers = {}; const ws_uri = config.kurentoms.url; // recover kurentoClient for the first time function getKurentoClient(callback) { if (kurentoClient !== null) { return callback(null, kurentoClient); } kurento(ws_uri, function(error, _kurentoClient) { if (error) { var message = 'Coult not find media server at address ' + ws_uri; console.error(message); return callback(message + ". Exiting with error " + error); } kurentoClient = _kurentoClient; callback(null, kurentoClient); }); } //Represents a B2B active call function CallMediaPipeline() { this._pipeline = null; this._callerWebRtcEndpoint = null; this._calleeWebRtcEndpoint = null; } CallMediaPipeline.prototype.createPipeline = function(callback) { var self = this; getKurentoClient(function(error, kurentoClient){ if(error){ return callback(error); } kurentoClient.create('MediaPipeline', function(error, pipeline) { if (error) { return callback(error); } pipeline.create('WebRtcEndpoint', function(error, callerWebRtcEndpoint) { if (error) { pipeline.release(); return callback(error); } pipeline.create('WebRtcEndpoint', function(error, calleeWebRtcEndpoint) { if (error) { pipeline.release(); return callback(error); } callerWebRtcEndpoint.connect(calleeWebRtcEndpoint, function(error) { if (error) { pipeline.release(); return callback(error); } calleeWebRtcEndpoint.connect(callerWebRtcEndpoint, function(error) { if (error) { pipeline.release(); return callback(error); } }); self._pipeline = pipeline; self._callerWebRtcEndpoint = callerWebRtcEndpoint; self._calleeWebRtcEndpoint = calleeWebRtcEndpoint; callback(null); }); }); }); }); }); } CallMediaPipeline.prototype.generateSdpAnswerForCaller = function(sdpOffer, callback) { this._callerWebRtcEndpoint.processOffer(sdpOffer, callback); } CallMediaPipeline.prototype.generateSdpAnswerForCallee = function(sdpOffer, callback) { this._calleeWebRtcEndpoint.processOffer(sdpOffer, callback); } CallMediaPipeline.prototype.release = function() { if(this._pipeline) this._pipeline.release(); this._pipeline = null; } /* SignalMaster */ if (config.logLevel) { // https://github.com/Automattic/socket.io/wiki/Configuring-Socket.IO io.set('log level', config.logLevel); } function describeRoom(name) { var clients = io.sockets.clients(name); var result = { clients: {} }; clients.forEach(function (client) { result.clients[client.id] = client.resources; }); return result; } function safeCb(cb) { if (typeof cb === 'function') { return cb; } else { return function () {}; } } io.sockets.on('connection', function (client) { client.resources = { screen: false, video: true, audio: false }; // // pass a message to another id // client.on('message', function (details) { // //// console.info('message ~ ' + JSON.stringify(details)); // // if (!details) return; // // if (details.type === 'offer') { //// console.info(client); //// console.info(describeRoom(client.room)); // client.resources.details = details; // console.info('RES > ' + JSON.stringify(client.resources)); // } // // var otherClient = io.sockets.sockets[details.to]; // console.info('RES > ' + JSON.stringify(otherClient.resources)); // // if (!otherClient) return; // // if (details.type === 'answer') { // // var pipeline = new CallMediaPipeline(); // // pipeline.createPipeline(function(error) { // if (error) { //// return onError(error, error); // console.error(error); // return ; // } // // if (otherClient.resources.details.payload.sdp) { // pipeline.generateSdpAnswerForCaller(otherClient.resources.details.payload.sdp, function(error, callerSdpAnswer) { // if (error) { //// return onError(error, error); // console.error(error); // return ; // } // pipeline.generateSdpAnswerForCallee(details.payload.sdp, function(error, calleeSdpAnswer) { // if (error) { //// return onError(error, error); // console.error(error); // return ; // } // // pipelines[client.id] = pipeline; // pipelines[details.to] = pipeline; // // client.emit('message', otherClient.resources.details); // // details.from = client.id; // otherClient.emit('message', details); // }); // }); // } // }); // // } else { // details.from = client.id; // otherClient.emit('message', details); // } // }); client.on('message', function(message) { if (!message) { return ; // do nothing } var other = io.sockets.sockets[message.to]; if (!other) { return ; // do nothing } if (message.type === 'offer') { // console.info('sending offer: ' + JSON.stringify(message)); offers[client.id] = message.payload.sdp; message.from = client.id; other.emit('message', message); } else if (message.type === 'answer') { // console.info('sending answer: ' + JSON.stringify(message)); var pipeline = new CallMediaPipeline(); pipeline.createPipeline(function(error) { if (error) { console.error(error); return ; // do nothing } var offer = offers[message.to]; pipeline.generateSdpAnswerForCaller(offer, function(error, callerSdpAnswer) { if (error) { console.error(error); return ; // do nothing } pipeline.generateSdpAnswerForCallee(message.payload.sdp, function(error, calleeSdpAnswer) { if (error) { console.error(error); return ; // do nothing } var answer = { 'to': message.to, 'sid': message.sid, 'roomType': message.roomType, 'type': 'offer', 'payload': { 'type': 'offer', 'sdp': callerSdpAnswer }, 'prefix': message.prefix, 'from': client.id }; console.info('Kurento generated SDP answer for caller (2nd user): ' + JSON.stringify(answer)); other.emit('message', answer); answer = { 'to': client.id, 'sid': message.sid, 'roomType': message.roomType, 'type': 'answer', 'payload': { 'type': 'answer', 'sdp': calleeSdpAnswer }, 'prefix': message.prefix, 'from': message.to }; console.info('Kurento generated SDP answer for callee (1st user): ' + JSON.stringify(answer)); client.emit('message', answer); }); }); }); } else { message.from = client.id; other.emit('message', message); } }); client.on('shareScreen', function () { client.resources.screen = true; }); client.on('unshareScreen', function (type) { client.resources.screen = false; removeFeed('screen'); }); client.on('join', join); function removeFeed(type) { if (client.room) { io.sockets.in(client.room).emit('remove', { id: client.id, type: type }); if (!type) { client.leave(client.room); client.room = undefined; } } } function join(name, cb) { // console.info('join ~ ' + name + ' ~ ' + cb); // sanity check if (typeof name !== 'string') return; // console.info(describeRoom(name)); // leave any existing rooms removeFeed(); safeCb(cb)(null, describeRoom(name)); client.join(name); client.room = name; } // we don't want to pass "leave" directly because the // event type string of "socket end" gets passed too. client.on('disconnect', function () { removeFeed(); }); client.on('leave', function () { removeFeed(); }); client.on('create', function (name, cb) { // never called...? // console.info('create ~ ' + name + ' ~ ' + cb); if (arguments.length == 2) { cb = (typeof cb == 'function') ? cb : function () {}; name = name || uuid(); } else { cb = name; name = uuid(); } // check if exists if (io.sockets.clients(name).length) { safeCb(cb)('taken'); } else { join(name); safeCb(cb)(null, name); } }); // tell client about stun and turn servers and generate nonces client.emit('stunservers', config.stunservers || []); // create shared secret nonces for TURN authentication // the process is described in draft-uberti-behave-turn-rest var credentials = []; config.turnservers.forEach(function (server) { var hmac = crypto.createHmac('sha1', server.secret); // default to 86400 seconds timeout unless specified var username = Math.floor(new Date().getTime() / 1000) + (server.expiry || 86400) + ""; hmac.update(username); credentials.push({ username: username, credential: hmac.digest('base64'), url: server.url }); }); client.emit('turnservers', credentials); }); if (config.uid) process.setuid(config.uid); console.info(yetify.logo() + ' -- signal master is running at: http://localhost:' + port); -------------- next part -------------- A non-text attachment was scrubbed... Name: media-server.log Type: application/octet-stream Size: 23801 bytes Desc: not available URL: <https://lists.fiware.org/private/fiware-creatifi-coaching/attachments/20150302/6869a1ae/attachment.obj> -------------- next part -------------- A non-text attachment was scrubbed... Name: signalmaster.log Type: application/octet-stream Size: 29625 bytes Desc: not available URL: <https://lists.fiware.org/private/fiware-creatifi-coaching/attachments/20150302/6869a1ae/attachment-0001.obj>
You can get more information about our cookies and privacy policies clicking on the following links: Privacy policy Cookies policy