From 5acf634579f173cbc35ca5aba141ec545e549d53 Mon Sep 17 00:00:00 2001 From: Hyunsu Date: Tue, 17 Oct 2017 16:11:12 +0900 Subject: [PATCH 01/12] start recorder --- kurento-recorder/README.md | 122 ++++++++ kurento-recorder/keys/README.md | 7 + kurento-recorder/keys/server.crt | 19 ++ kurento-recorder/keys/server.csr | 16 + kurento-recorder/keys/server.key | 27 ++ kurento-recorder/package.json | 19 ++ kurento-recorder/server.js | 280 ++++++++++++++++++ kurento-recorder/static/bower.json | 28 ++ kurento-recorder/static/css/kurento.css | 53 ++++ kurento-recorder/static/img/kurento.png | Bin 0 -> 6499 bytes kurento-recorder/static/img/naevatec.png | Bin 0 -> 52049 bytes kurento-recorder/static/img/pipeline.png | Bin 0 -> 78340 bytes kurento-recorder/static/img/spinner.gif | Bin 0 -> 8534 bytes .../static/img/transparent-1px.png | Bin 0 -> 68 bytes kurento-recorder/static/img/urjc.gif | Bin 0 -> 16756 bytes kurento-recorder/static/img/webrtc.png | Bin 0 -> 12375 bytes kurento-recorder/static/index.html | 120 ++++++++ kurento-recorder/static/js/index.js | 188 ++++++++++++ 18 files changed, 879 insertions(+) create mode 100644 kurento-recorder/README.md create mode 100644 kurento-recorder/keys/README.md create mode 100644 kurento-recorder/keys/server.crt create mode 100644 kurento-recorder/keys/server.csr create mode 100644 kurento-recorder/keys/server.key create mode 100644 kurento-recorder/package.json create mode 100755 kurento-recorder/server.js create mode 100644 kurento-recorder/static/bower.json create mode 100644 kurento-recorder/static/css/kurento.css create mode 100644 kurento-recorder/static/img/kurento.png create mode 100644 kurento-recorder/static/img/naevatec.png create mode 100644 kurento-recorder/static/img/pipeline.png create mode 100644 kurento-recorder/static/img/spinner.gif create mode 100644 kurento-recorder/static/img/transparent-1px.png create mode 100644 kurento-recorder/static/img/urjc.gif create mode 100644 kurento-recorder/static/img/webrtc.png create mode 100644 kurento-recorder/static/index.html create mode 100644 kurento-recorder/static/js/index.js diff --git a/kurento-recorder/README.md b/kurento-recorder/README.md new file mode 100644 index 00000000..d99499ba --- /dev/null +++ b/kurento-recorder/README.md @@ -0,0 +1,122 @@ +[![License badge](https://img.shields.io/badge/license-Apache2-orange.svg)](http://www.apache.org/licenses/LICENSE-2.0) +[![Documentation badge](https://readthedocs.org/projects/fiware-orion/badge/?version=latest)](http://doc-kurento.readthedocs.org/en/latest/) +[![Docker badge](https://img.shields.io/docker/pulls/fiware/orion.svg)](https://hub.docker.com/r/fiware/stream-oriented-kurento/) +[![Support badge]( https://img.shields.io/badge/support-sof-yellowgreen.svg)](http://stackoverflow.com/questions/tagged/kurento) + +[![][KurentoImage]][Kurento] + +Copyright © 2013-2016 [Kurento]. Licensed under [Apache 2.0 License]. + +kurento-hello-world +=================== + +Kurento Java Tutorial: Hello World (WebRTC in loopback). + +Running this tutorial +--------------------- + +In order to run this tutorial, please read the following [instructions]. + +What is Kurento +--------------- + +Kurento is an open source software project providing a platform suitable +for creating modular applications with advanced real-time communication +capabilities. For knowing more about Kurento, please visit the Kurento +project website: http://www.kurento.org. + +Kurento is part of [FIWARE]. For further information on the relationship of +FIWARE and Kurento check the [Kurento FIWARE Catalog Entry] + +Kurento is part of the [NUBOMEDIA] research initiative. + +Documentation +------------- + +The Kurento project provides detailed [documentation] including tutorials, +installation and development guides. A simplified version of the documentation +can be found on [readthedocs.org]. The [Open API specification] a.k.a. Kurento +Protocol is also available on [apiary.io]. + +Source +------ + +Code for other Kurento projects can be found in the [GitHub Kurento Group]. + +News and Website +---------------- + +Check the [Kurento blog] +Follow us on Twitter @[kurentoms]. + +Issue tracker +------------- + +Issues and bug reports should be posted to the [GitHub Kurento bugtracker] + +Licensing and distribution +-------------------------- + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Contribution policy +------------------- + +You can contribute to the Kurento community through bug-reports, bug-fixes, new +code or new documentation. For contributing to the Kurento community, drop a +post to the [Kurento Public Mailing List] providing full information about your +contribution and its value. In your contributions, you must comply with the +following guidelines + +* You must specify the specific contents of your contribution either through a + detailed bug description, through a pull-request or through a patch. +* You must specify the licensing restrictions of the code you contribute. +* For newly created code to be incorporated in the Kurento code-base, you must + accept Kurento to own the code copyright, so that its open source nature is + guaranteed. +* You must justify appropriately the need and value of your contribution. The + Kurento project has no obligations in relation to accepting contributions + from third parties. +* The Kurento project leaders have the right of asking for further + explanations, tests or validations of any code contributed to the community + before it being incorporated into the Kurento code-base. You must be ready to + addressing all these kind of concerns before having your code approved. + +Support +------- + +The Kurento project provides community support through the [Kurento Public +Mailing List] and through [StackOverflow] using the tags *kurento* and +*fiware-kurento*. + +Before asking for support, please read first the [Kurento Netiquette Guidelines] + +[documentation]: http://www.kurento.org/documentation +[FIWARE]: http://www.fiware.org +[GitHub Kurento bugtracker]: https://github.com/Kurento/bugtracker/issues +[GitHub Kurento Group]: https://github.com/kurento +[kurentoms]: http://twitter.com/kurentoms +[Kurento]: http://kurento.org +[Kurento Blog]: http://www.kurento.org/blog +[Kurento FIWARE Catalog Entry]: http://catalogue.fiware.org/enablers/stream-oriented-kurento +[Kurento Netiquette Guidelines]: http://www.kurento.org/blog/kurento-netiquette-guidelines +[Kurento Public Mailing list]: https://groups.google.com/forum/#!forum/kurento +[KurentoImage]: https://secure.gravatar.com/avatar/21a2a12c56b2a91c8918d5779f1778bf?s=120 +[Apache 2.0 License]: http://www.apache.org/licenses/LICENSE-2.0 +[NUBOMEDIA]: http://www.nubomedia.eu +[StackOverflow]: http://stackoverflow.com/search?q=kurento +[Read-the-docs]: http://read-the-docs.readthedocs.org/ +[readthedocs.org]: http://kurento.readthedocs.org/ +[Open API specification]: http://kurento.github.io/doc-kurento/ +[apiary.io]: http://docs.streamoriented.apiary.io/ +[instructions]: http://www.kurento.org/docs/current/tutorials/node/tutorial-helloworld.html diff --git a/kurento-recorder/keys/README.md b/kurento-recorder/keys/README.md new file mode 100644 index 00000000..9603ced3 --- /dev/null +++ b/kurento-recorder/keys/README.md @@ -0,0 +1,7 @@ +[![License badge](https://img.shields.io/badge/license-Apache2-orange.svg)](http://www.apache.org/licenses/LICENSE-2.0) +[![Documentation badge](https://readthedocs.org/projects/fiware-orion/badge/?version=latest)](http://doc-kurento.readthedocs.org/en/latest/) +[![Docker badge](https://img.shields.io/docker/pulls/fiware/orion.svg)](https://hub.docker.com/r/fiware/stream-oriented-kurento/) +[![Support badge]( https://img.shields.io/badge/support-sof-yellowgreen.svg)](http://stackoverflow.com/questions/tagged/kurento) + +This folder contains a dummy self-signed certificate only for demo purposses, +**DON'T USE IT IN PRODUCTION**. diff --git a/kurento-recorder/keys/server.crt b/kurento-recorder/keys/server.crt new file mode 100644 index 00000000..65e608da --- /dev/null +++ b/kurento-recorder/keys/server.crt @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDBjCCAe4CCQCuf5QfyX2oDDANBgkqhkiG9w0BAQsFADBFMQswCQYDVQQGEwJB +VTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0 +cyBQdHkgTHRkMB4XDTE0MDkyOTA5NDczNVoXDTE1MDkyOTA5NDczNVowRTELMAkG +A1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0 +IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AMJOyOHJ+rJWJEQ7P7kKoWa31ff7hKNZxF6sYE5lFi3pBYWIY6kTN/iUaxJLROFo +FhoC/M/STY76rIryix474v/6cRoG8N+GQBEn4IAP1UitWzVO6pVvBaIt5IKlhhfm +YA1IMweCd03vLcaHTddNmFDBTks7QDwfenTaR5VjKYc3OtEhcG8dgLAnOjbbk2Hr +8wter2IeNgkhya3zyoXnTLT8m8IMg2mQaJs62Xlo9gs56urvVDWG4rhdGybj1uwU +ZiDYyP4CFCUHS6UVt12vADP8vjbwmss2ScGsIf0NjaU+MpSdEbB82z4b2NiN8Wq+ +rFA/JbvyeoWWHMoa7wkVs1MCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAYLRwV9fo +AOhJfeK199Tv6oXoNSSSe10pVLnYxPcczCVQ4b9SomKFJFbmwtPVGi6w3m+8mV7F +9I2WKyeBHzmzfW2utZNupVybxgzEjuFLOVytSPdsB+DcJomOi8W/Cf2Vk8Wykb/t +Ctr1gfOcI8rwEGKxm279spBs0u1snzoLyoimbMbiXbC82j1IiN3Jus08U07m/j7N +hRBCpeHjUHT3CRpvYyTRnt+AyBd8BiyJB7nWmcNI1DksXPfehd62MAFS9e1ZE+dH +Aavg/U8VpS7pcCQcPJvIJ2hehrt8L6kUk3YUYqZ0OeRZK27f2R5+wFlDF33esm3N +dCSsLJlXyqAQFg== +-----END CERTIFICATE----- diff --git a/kurento-recorder/keys/server.csr b/kurento-recorder/keys/server.csr new file mode 100644 index 00000000..6615b130 --- /dev/null +++ b/kurento-recorder/keys/server.csr @@ -0,0 +1,16 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIICijCCAXICAQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUx +ITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAMJOyOHJ+rJWJEQ7P7kKoWa31ff7hKNZxF6sYE5l +Fi3pBYWIY6kTN/iUaxJLROFoFhoC/M/STY76rIryix474v/6cRoG8N+GQBEn4IAP +1UitWzVO6pVvBaIt5IKlhhfmYA1IMweCd03vLcaHTddNmFDBTks7QDwfenTaR5Vj +KYc3OtEhcG8dgLAnOjbbk2Hr8wter2IeNgkhya3zyoXnTLT8m8IMg2mQaJs62Xlo +9gs56urvVDWG4rhdGybj1uwUZiDYyP4CFCUHS6UVt12vADP8vjbwmss2ScGsIf0N +jaU+MpSdEbB82z4b2NiN8Wq+rFA/JbvyeoWWHMoa7wkVs1MCAwEAAaAAMA0GCSqG +SIb3DQEBCwUAA4IBAQBMszYHMpklgTF/3h1zAzKXUD9NrtZp8eWhL06nwVjQX8Ai +EaCUiW0ypstokWcH9+30chd2OD++67NbxYUEucH8HrKpOoy6gs5L/mqgQ9Npz3OT +TB1HI4kGtpVuUQ5D7L0596tKzMX/CgW/hRcHWl+PDkwGhQs1qZcJ8QN+YP6AkRrO +5sDdDB/BLrB9PtBQbPrYIQcHQ7ooYWz/G+goqRxzZ6rt0aU2uAB6l7c82ADLAqFJ +qlw+xqVzEETVfqM5TXKK/wV3hgm4oSX5Q4SHLKF94ODOkWcnV4nfIKz7y+5XcQ3p +PrGimI1br07okC5rO9cgLCR0Ks20PPFcM0FvInW/ +-----END CERTIFICATE REQUEST----- diff --git a/kurento-recorder/keys/server.key b/kurento-recorder/keys/server.key new file mode 100644 index 00000000..a69a0a27 --- /dev/null +++ b/kurento-recorder/keys/server.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEogIBAAKCAQEAwk7I4cn6slYkRDs/uQqhZrfV9/uEo1nEXqxgTmUWLekFhYhj +qRM3+JRrEktE4WgWGgL8z9JNjvqsivKLHjvi//pxGgbw34ZAESfggA/VSK1bNU7q +lW8Foi3kgqWGF+ZgDUgzB4J3Te8txodN102YUMFOSztAPB96dNpHlWMphzc60SFw +bx2AsCc6NtuTYevzC16vYh42CSHJrfPKhedMtPybwgyDaZBomzrZeWj2Cznq6u9U +NYbiuF0bJuPW7BRmINjI/gIUJQdLpRW3Xa8AM/y+NvCayzZJwawh/Q2NpT4ylJ0R +sHzbPhvY2I3xar6sUD8lu/J6hZYcyhrvCRWzUwIDAQABAoIBACwt56TW3MZxqZtN +8WYsUZheUispJ/ZQMcLo5JjOiSV1Jwk+gpJtyTse291z+bxagzP02/CQu4u32UVa +cmE0cp+LHO4zB8964dREwdm8P91fdS6Au/uwG5LNZniCFCQZAFvkv52Ef4XbzQen +uf4rKWerHBck6K0C5z/sZXxE6KtScE2ZLUmkhO0nkHM6MA6gFk2OMnB+oDTOWWPt +1mlreQlzuMYG/D4axviRYrOSYCE5Qu1SOw/DEOLQqqeBjQrKtAyOlFHZsIR6lBfe +KHMChPUcYIwaowt2DcqH/A+AFXRtaifa6DvH8Yul+2vAp47UEpaenVfM5bpN33XV +EzerjtECgYEA+xiXzblek67iQgRpc9eHSoqs4iRLhae8s8kpAG51Jz46Je+Dmium +XV769oiUGUxBeoUb7ryW+4MOzHJaA1BfGejQSvwLIB9e4cnikqnAArcqbcAcOCL1 +aYYDiSmSmN/AokNZlPKEBFXP9bzXrU9smQJWNTHlcRl7JXfnwF+jwNsCgYEAxhpE +SBr9vlUVHNh/S6C5i80NIYg6jCy2FgsmuzEqmcqV0pTyzegmq8bru+QmuvoUj2o4 +nVv4J9d1fLF6ECUVk9aK8UdJOOB6hAfurOdJCArgrsY/9t4uDzXfbPCdfSNQITE0 +XgeNGQX1EzvwwkBmyZKk0kLIr3syP8ZCWfXDROkCgYBR+dF1pJMv++R6UR5sZ20P +9P5ERj0xwXVl7MKqFWXCDhrFz9BTQPTrftrIKgbPy4mFCnf4FTHlov/t11dzxYWG +2+9Ey8yGDDfZ1yNVZn39ZPdBJXsRCLi+XrZAzYXCyyoEz6ArdJGNKMbgH2r6dfeq +bIzgiQ2zQvJlZSQQNiksCQKBgCgwzAmU8EXdHRttEOZXBU3HnBJhgP9PUuHGAWWY +4/uvjhXbAiekIbRX9xt3fiQQ+HrgIfxK3F246K0TlKAR5f7IWAf7Xm+bmz+OHG4X +vklTa6IJtpBvIwkS9PE1H75zm54gTW+GOKoK+12bm4zNZA0hIy9FPVHcvKUTpAJ8 +SdGBAoGAHLtJnB1NO4EgO6WtLQMXt7HrIbup8eZi8/82gC3422C+ooKIrYQ07qSw +nBOO/G0OB4yd6vCE2x5+TWSSCYGgG5A8aIv5qP76RP4hovGHxG/y2tfotw5UuOrh +nFWlTP4Urs8PeykvK9ao8r/T8BnPIC16U6ENYvAc0mRlFA2j1GA= +-----END RSA PRIVATE KEY----- diff --git a/kurento-recorder/package.json b/kurento-recorder/package.json new file mode 100644 index 00000000..7efe9ec7 --- /dev/null +++ b/kurento-recorder/package.json @@ -0,0 +1,19 @@ +{ + "name": "kurento-hello-world", + "version": "6.6.1", + "private": true, + "scripts": { + "postinstall": "cd static && bower install" + }, + "dependencies": { + "cookie-parser": "^1.3.5", + "express": "~4.12.4", + "express-session": "~1.10.3", + "minimist": "^1.1.1", + "ws": "~1.0.1", + "kurento-client": "6.6.0" + }, + "devDependencies": { + "bower": "^1.4.1" + } +} diff --git a/kurento-recorder/server.js b/kurento-recorder/server.js new file mode 100755 index 00000000..fba5dae6 --- /dev/null +++ b/kurento-recorder/server.js @@ -0,0 +1,280 @@ +/* + * (C) Copyright 2014-2015 Kurento (http://kurento.org/) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +var path = require('path'); +var url = require('url'); +var cookieParser = require('cookie-parser') +var express = require('express'); +var session = require('express-session') +var minimist = require('minimist'); +var ws = require('ws'); +var kurento = require('kurento-client'); +var fs = require('fs'); +var https = require('https'); + +var argv = minimist(process.argv.slice(2), { + default: { + as_uri: 'https://localhost:8443/', + ws_uri: 'ws://localhost:8888/kurento' + } +}); + +var options = +{ + key: fs.readFileSync('keys/server.key'), + cert: fs.readFileSync('keys/server.crt') +}; + +var app = express(); + +/* + * Management of sessions + */ +app.use(cookieParser()); + +var sessionHandler = session({ + secret : 'none', + rolling : true, + resave : true, + saveUninitialized : true +}); + +app.use(sessionHandler); + +/* + * Definition of global variables. + */ +var sessions = {}; +var candidatesQueue = {}; +var kurentoClient = null; + +/* + * Server startup + */ +var asUrl = url.parse(argv.as_uri); +var port = asUrl.port; +var server = https.createServer(options, app).listen(port, function() { + console.log('Kurento Tutorial started'); + console.log('Open ' + url.format(asUrl) + ' with a WebRTC capable browser'); +}); + +var wss = new ws.Server({ + server : server, + path : '/helloworld' +}); + +/* + * Management of WebSocket messages + */ +wss.on('connection', function(ws) { + var sessionId = null; + var request = ws.upgradeReq; + var response = { + writeHead : {} + }; + + sessionHandler(request, response, function(err) { + sessionId = request.session.id; + console.log('Connection received with sessionId ' + sessionId); + }); + + ws.on('error', function(error) { + console.log('Connection ' + sessionId + ' error'); + stop(sessionId); + }); + + ws.on('close', function() { + console.log('Connection ' + sessionId + ' closed'); + stop(sessionId); + }); + + ws.on('message', function(_message) { + var message = JSON.parse(_message); + console.log('Connection ' + sessionId + ' received message ', message); + + switch (message.id) { + case 'start': + sessionId = request.session.id; + start(sessionId, ws, message.sdpOffer, function(error, sdpAnswer) { + if (error) { + return ws.send(JSON.stringify({ + id : 'error', + message : error + })); + } + ws.send(JSON.stringify({ + id : 'startResponse', + sdpAnswer : sdpAnswer + })); + }); + break; + + case 'stop': + stop(sessionId); + break; + + case 'onIceCandidate': + onIceCandidate(sessionId, message.candidate); + break; + + default: + ws.send(JSON.stringify({ + id : 'error', + message : 'Invalid message ' + message + })); + break; + } + + }); +}); + +/* + * Definition of functions + */ + +// Recover kurentoClient for the first time. +function getKurentoClient(callback) { + if (kurentoClient !== null) { + return callback(null, kurentoClient); + } + + kurento(argv.ws_uri, function(error, _kurentoClient) { + if (error) { + console.log("Could not find media server at address " + argv.ws_uri); + return callback("Could not find media server at address" + argv.ws_uri + + ". Exiting with error " + error); + } + + kurentoClient = _kurentoClient; + callback(null, kurentoClient); + }); +} + +function start(sessionId, ws, sdpOffer, callback) { + if (!sessionId) { + return callback('Cannot use undefined sessionId'); + } + + getKurentoClient(function(error, kurentoClient) { + if (error) { + return callback(error); + } + + kurentoClient.create('MediaPipeline', function(error, pipeline) { + if (error) { + return callback(error); + } + + createMediaElements(pipeline, ws, function(error, webRtcEndpoint) { + if (error) { + pipeline.release(); + return callback(error); + } + + if (candidatesQueue[sessionId]) { + while(candidatesQueue[sessionId].length) { + var candidate = candidatesQueue[sessionId].shift(); + webRtcEndpoint.addIceCandidate(candidate); + } + } + + connectMediaElements(webRtcEndpoint, function(error) { + if (error) { + pipeline.release(); + return callback(error); + } + + webRtcEndpoint.on('OnIceCandidate', function(event) { + var candidate = kurento.getComplexType('IceCandidate')(event.candidate); + ws.send(JSON.stringify({ + id : 'iceCandidate', + candidate : candidate + })); + }); + + webRtcEndpoint.processOffer(sdpOffer, function(error, sdpAnswer) { + if (error) { + pipeline.release(); + return callback(error); + } + + sessions[sessionId] = { + 'pipeline' : pipeline, + 'webRtcEndpoint' : webRtcEndpoint + } + return callback(null, sdpAnswer); + }); + + webRtcEndpoint.gatherCandidates(function(error) { + if (error) { + return callback(error); + } + }); + }); + }); + }); + }); +} + +function createMediaElements(pipeline, ws, callback) { + pipeline.create('WebRtcEndpoint', function(error, webRtcEndpoint) { + if (error) { + return callback(error); + } + + return callback(null, webRtcEndpoint); + }); +} + +function connectMediaElements(webRtcEndpoint, callback) { + webRtcEndpoint.connect(webRtcEndpoint, function(error) { + if (error) { + return callback(error); + } + return callback(null); + }); +} + +function stop(sessionId) { + if (sessions[sessionId]) { + var pipeline = sessions[sessionId].pipeline; + console.info('Releasing pipeline'); + pipeline.release(); + + delete sessions[sessionId]; + delete candidatesQueue[sessionId]; + } +} + +function onIceCandidate(sessionId, _candidate) { + var candidate = kurento.getComplexType('IceCandidate')(_candidate); + + if (sessions[sessionId]) { + console.info('Sending candidate'); + var webRtcEndpoint = sessions[sessionId].webRtcEndpoint; + webRtcEndpoint.addIceCandidate(candidate); + } + else { + console.info('Queueing candidate'); + if (!candidatesQueue[sessionId]) { + candidatesQueue[sessionId] = []; + } + candidatesQueue[sessionId].push(candidate); + } +} + +app.use(express.static(path.join(__dirname, 'static'))); diff --git a/kurento-recorder/static/bower.json b/kurento-recorder/static/bower.json new file mode 100644 index 00000000..afe97009 --- /dev/null +++ b/kurento-recorder/static/bower.json @@ -0,0 +1,28 @@ +{ + "name": "kurento-hello-world", + "description": "Kurento Browser JavaScript Tutorial", + "authors": [ + "Kurento " + ], + "main": "index.html", + "moduleType": [ + "globals" + ], + "license": "ALv2", + "homepage": "http://www.kurento.org/", + "private": true, + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests" + ], + "dependencies": { + "adapter.js": "v0.2.9", + "bootstrap": "~3.3.0", + "ekko-lightbox": "~3.3.0", + "demo-console": "1.5.1", + "kurento-utils": "6.6.2" + } +} diff --git a/kurento-recorder/static/css/kurento.css b/kurento-recorder/static/css/kurento.css new file mode 100644 index 00000000..376484ef --- /dev/null +++ b/kurento-recorder/static/css/kurento.css @@ -0,0 +1,53 @@ +/* + * (C) Copyright 2014-2015 Kurento (http://kurento.org/) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +@CHARSET "UTF-8"; + +html { + position: relative; + min-height: 100%; +} + +body { + padding-top: 40px; + body +} + +video,#console { + display: block; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, box-shadow + ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} + +#console { + min-height: 120px; + max-height: 360px; +} + +.col-md-2 { + width: 80px; + padding-top: 190px; +} diff --git a/kurento-recorder/static/img/kurento.png b/kurento-recorder/static/img/kurento.png new file mode 100644 index 0000000000000000000000000000000000000000..6f1a4ad3b243c7a31ddff38a00835b7e5eea30ca GIT binary patch literal 6499 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 JPDHLkV1gbuNT~n- literal 0 HcmV?d00001 diff --git a/kurento-recorder/static/img/naevatec.png b/kurento-recorder/static/img/naevatec.png new file mode 100644 index 0000000000000000000000000000000000000000..05ee7041db5f47d4953c24f67cd2d645ca114ea8 GIT binary patch literal 52049 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 z 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

c<=S*Kh*kAKY-Ef~XNGbmZ#y^SxPd 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 z zq|}(dR=inOtkS~UATJs8?%fPTfa6t8x$0Wm6a2w`npBqff-Wsl4#wwV9zAbpR0+nN z_6$m#u*!T+TLHQeBOGgdCs1R1(Zs8D6wbZsV{6na9>%V>^VBkTzPmA)!b38QRXeb;rjqq|UHBrBc^p zA#~Tc`|5Euwvi76-XE}abDybc6=pR_@$&M0`GS0;5L#+(&g#_`BsvI?HpnfK)z z_5Q3?^GS-(`A#j+!HyctN9ufykP#8FUgvLcTO+GIKQKg}55>T`H}#12)ERSE`p%_u zV=YX1`o+|Xo9G(j|BS!VDp*?>?=begbTYXwz}2V#$s5CbgQn+_+#~?iQ!FDI#`5& z^F+#_`wbvPJIA>jXz`fJL@O~l_~!SYE#th^pR%9={LoU%e`$q3R^)@5#qBb*^m00@ z#WS^$PgzZS#ipTacaOJCczM;;Uul9yb0xHyn-;Y2#lXt~ioq*`A8*y(44VUT4b)9g zPwX`xjh+AuvD(eS8PpS1h=}HE4;g!}9gW`~?S2lHIX>xTg%!D*bof&vmylZ?!bZ4z zyHsvkwvJ{+|JdkgmH*G$>fp&k$0G)4IS<@QAYjYL%hU7m#RA*w76nB}S{n5_dzY)t zRPcFxWQ<4Sd?%x@u+HWK+5~xZ4v<}Hg2fGS4FJZN)%LFqYkzx+S?ZwHww1puU91al z>rxcEXFt@R@f|I`Ox~raD~OQzbZPj5ex8-Lr2dyZ585 z*jG+RRjzU1@bdDstDHSt7$Bli-+a_Xq^v%1IaLEpfPz9kAwnUss2bZ)yECZ-^-?u9 zC#Selhku=dbG|l#If!`v6J;^|#^TN3wJ=^+ivOXekmV-Wy`>Hj1$v@*dDXZibRh>0 zz7m>m0Qn-oUL*l>7ZnwC9j5%TvB8juPtKd%BY^>_{|xB93v*@DoB)lH;^Ii)ba!=g zyJ@#}%h@~9Q_R!D_vK3PIVXPu);s9405$APKoOT49E9o@ThO&>-gOkLoGMcJmz$ya z_Arg$$em)Sf36~x-MdN%FY}}nesMs)Nbth!;fIgkCB{4l;is8eQ+{&qQ?-l8P?)DH zh@{+yav9h5;v=yln{3imW5Q^u@9uRMmA!WvE9ik5M^&xB4lgSF9GxAM>iL_tE_Y#39Vm$r7f*tVPQeG z7A7eM+F9MYeY^E=dja$Mbu=dzmWiU9D~PjwSyTY2Nf(LL+Hw-8K5wY3wwss?!*BP6 zx~La*a_=J~Vv|dRcAkPj{5|`<^AX{V#hmra-4^%l7MtiF@|9GNh;YB}>_~o}k|5t? zD4eI0C};VGl6?A&9CpPkpru~ur|)HWc0rk*{^Mk|pCkdW%*2Uy*=cF^;E}kJr`UpL7@ku2{_OGO;lxyc$HvBF{Ysik$xtPE*75pGOX|e1$aaXhrJvt$ z>4J4_kd8G0f{%|69^ge^4O!3M{v?04x2rdQHslu0xbilYg;BoSKG>{~kGExLs@(idua&^=Q}CYTdkW}_^N@JAMptg0^+OMAVKdDoCu37hXZmLed*3b`{SZe= zN-dhji_6n8`iaX2{>DPC_^ysF1*1@?ujSTUdO_%llMT7MqpD2-r9$S?CSq zF?~ZpO1kE4atUi&d})zA{H4Vfjql&1sbr{-#A{0Q-1pyvmY6U%tZ(CwZGF3}p{QKL z-jvKF|6*ns$$B_g{wIz1UFt8Ij+?*nZ`0PjzQN@mkAH)Uc3nL1)GgvR_BG%lLTSK< z{QS_pJ?ErKPA^3&G zO*lz8NwF`pFyPMha{3Rqp!D+iXj7wFuJ`R9MpSf$`cVp-wH%mBY9~1dr~e4BP2|?0 zb*}RtzKmD2E<9DaDN;A@j^xFA@Xd58O);R3`fU$B>u&@6o9r78{o$jo!+lENBZe?W zc5yMFK+Nq~p6E-l0XsWFKYx4ALMCLFjw}|=M`nK01~>K<9^)^~ww^OM{=*^yyqoVV z_HRNakawmDX>j7oH}R3YDZClL$k;N_na25AiBZw$@RRKD#44)5 zqg#Q1@t5P8J92YogvXlVUEMC*13mYk$qx@Z3_jvhG1_GOH#nF;am)BZ5|+?l`u?f# zS<0~>`^hK$37*<=!O|flSXiIC4ubP->N4@G18DcEg9r}o+Xz?dj-L-se8inPWp{@E zEZOqE-vv-1HfLKsAGqCrXZ^eRJyVJ6mQk(iBCWb&!kdYKp~`{dJfB5cKE>3K{)QmS z6wZssT!xywPWN86$MsTE_&w(O-yRmH&B7;tIrMIzp;?*Yreb0^|7Jk}#op#`d$*B5 zWaX#$(f({Z?*&T#VH7s9^}QCC6`6B?_Ka=7s8U+k#LiM)0$*rMe-_en`C075>-KC# z!_O|UNrviY5kp$+2*56|G#uA(E4>;d$!Y3C? z4SmmuQ%ArwIhgdE+X+Q3U9{31T20$PmB9I03s1Bq_dOH0$ClCA9}=MjAyc1FhuYVL z6ZMtv8M%BqNT*3yzv2J?A6oWZy=uMHuXWVu5p^{t{9#MN9IFW`Qs5`6vAbNm=WKb5 zU{*ZeO{35&wU>GDXYNLNoOjq-MmX*bq|!m7YRqLgvr+Rw?jMz7j z`)TgMuO4FsomgUW$%#=%HUXo4wJ)<_%=`Om4h`G3@2QA|{AB1bLggbS|NRj@*&Uno z|FgVTskG9*rj7c!KB1#)!Ni`8E+=VzAR;qTa-2mqS^Cb;%KA#4PQcI%_g!0iid)-d zmh;iRBF;*p-^Izv)klV3ocBlw$R{xtx-9=3^O)FPvzbn-n;(^Ze@%R~f9mAz6&)QF z^};(&Yl%14Fsn;H2@bz6wY!|j-i00!yO@5+BOr6UA=3MwO(sNuopM2GT8Td(;_8i- zlzNI!+?LQ2k(5YIAz8H{daJzh=5B8G%dKH<`qVMhyZag>6h5ac#G}JSh&IC7le2vc z-9r*HVXvcC?dxyaZDw}s3QH?jzhk(yH@#Kk)~9zk6$(zKV0M}mN@sJh%Nif>&#|)R zS#``Fu;4(QdB^+u($H&8O8(D$!nlS-!jNxshe8Gz7@sELE5XQkH|_Y*r_m!#QuJJT z?+xu79peP09D7z2nevaNdV~!z%KsV&peokZKO@txysV#cf3DDeFYR!P%{z_UyAJHm zgJZRvvdZ3BWI!w`m2OhK5cSo~t@rngLSY?s)`y3z=n45}!O=sI!7H{<-g6pUQ~Jas z6#QOvlEQ7BAIADtQsTu0t4Y1t;rzLlzHU&RxcLz@+#uk4Gv7_F?z_-Ujnq4)yu5&t z{#CPo{eT50nLqs3)$O2@KN7fJXSe4-Uu$dU!_X9-#EVx0X4u%@C@4N%R}Ext@Oz5( z8B_y9Q!U!s4AW)D79`rXyC2&2M3~{;_+*iWx8Pi*I=d*-B!r=u_grFmdB8qU1nG>U zFE|XpZmCRJcRX@6#JxdL+^sz+OoV{*mJlI+w*mctA8Eh2w6wjQ*=fOnzRKMElZ0*c zC*^G)%R1ax)T|45DmFei6*8f`Yc=8R|C@-XFe*X>-Q9*amjdJ+UR?01Jzm_}oZr$@ z(iRah+uixlXc$g$r_gGq-9rQvkJGzdsIxAd)1D^Jp;T#28fp1l)^$fmM|rq!?fXqn zBcN5N*y_eHWRn3A&cS;)PQXfx1?5LTk$j9cvb(e|T5 zV2F$T?H1_=Gi4Z#luBSirwN*G0qJ7qd-u`-6KgXl0Wol(?L$FCy+K-Xz8;DUYU%)F z-_>d{D23b|&@c784~>O{(bIyAyoq>yQRNAX8m&nt?X`%M_dleuNH$xW-?{pHzeGHa z+$b^Yc z`BjAop-zFQ9^#(Z4Oq6rT^|e3;(^!Js7R{zaO2)@VB>PRJ6aK z7cKt3k8KlY^-9BI=GLc~J2d?iJ-FOKBBK$gWfQo&x7P=iye=-~(JF1q%cXXcmV8tE zv}G%YrWnp0L?3B`i&n(*?(@Bs_Yp&zy`rwys9X)?LOVxhwEFbqK<;(Tg@@C8{P#~! zKZk@W2WsgAIypM^j*g03Sgf#FW|ZW<2bTJ%^?3eQqc~I3=3eLb&;DqLBR1X=O=<&ca1Z+6K-P zdoxbb^>_H&Nykm!!YX-s^lv&3IJC8wJ*RSj3VCbDVO)8aWf2dhOzf4Gb1E&eo!!ll6YaH?{-StZO4nV&McB@X)0OJ+6< zA`Foi&SiqzL8rH6=Aac@TUdy>vwL>96Lez zCDX_lori{oBH4PwqN5c^PxcWZJJh?-6H|%;G%o;=F&1k8|DsWgpAc4~=yKfb! z=JysmWH+_ML|ZA4D4Tk2ILPt>?pinlzgT$1uz(_kSaA4|=*h{Qmaew>7t`KhR6%q! ztbVH5we>z}988J}5fx&w%k7L^8b-)-Gcw-H5y^&)?9VjeD7{pA3Q56C9L=-c8^y#;G@SYKgwT8R)*9)vvl zbPA6|hB^Nye7Eo9r{xqFV@%OF)SMO-Y>vyo6yZL7rPtuQpMSvbjTLDbGoCNZ0YRZ* z40E;=T(TISb93&Di^Z$nPLOPreA;iFerU;M7u1@3b}we};EH1E1H~6IoLY|`Co8t6 z(+H;p;``jfqqp06aR*Zw^9sh>TQ>=mMqA%ggvrs|x%Z|h(9B-W{9=XU?@J3^{B|F| z1Z^vHCW>H!(OD&rTzw%{HtEXge64{9t@Dzn$m2sn z!q{hhz1|7X_^Imn$n1fRgqi~7gvj$}(Znh)>zCHzbY5D&%*?J%ns2&xi|*3M(vqBN z+|5^2Z7R!TNlTU}89Ujl6Cx8|U7Y)RCm(5;l9<*CNoqP$kR)>SPmCzINRu}*FgWh+ z^*Po?mc^Pp36@)0ue0CPT*)*^Wao4EQtAJ$)9Qa?w)4zB{?>K)?Y@qGT(nAzs!Z5OZg~ah@47wzVX8sr{!afrg$Jw0F;dnHg|V+OlWpdA2R+a0dHv>}`OM6n&%O8DbI&>V z-t&Hc1hQi?(XA~F7PB7v)^5;5u-SF2QCn^@rBcfA4X|p}_tZc7*MT?&G|x5*XYg32 zINHT??!;Z=tQgd(S!GLNBd2LROVL5ycZ_{f4Br$*3W`(vS)ilU_)i;>cEZyW34;5* zdz{}J`b?!-RDhrawGamFRAn;|1OgTo5M2cNetzjTs-vYLq`tb_%w&hpI=Hhn=k~Uv z*YiMa9jdYQc=*fIi6U{(Y8KS)?5piK@4{DMF?tV6X0^3xk=3LH_;RPWD%hx?j=_=S zZY=Mhbq!_B`mT9a%-0Y`_vsHWBzI$SgZ?(GbkA=8NU#@6#M~Cj=6J}#gr7SJ7jH{h=-kzHH4g{s2eNP_F~jq(I4Vt z^ya9WEqj9Fv~sZJMjMDY*ZB*|0>Sx-Qm0F4(69fLh`%;9D>+k-xc`PVapAVm)N$uA zVR6Q=A;}8OAoGU5bsY=a-F3qz$`&Id$!0GE<-x5ED^^)gG#V~${Ryja8T%_$#SDRs z!E}8S6ltM9OC1cz;9;JnhUXq;$x8KoUSEhOKt%YGg}&s;`8Jn-wROR;u)e1x578pm z3#Zds2gm;E1S47+wlCXtvXh0)8j!#_+qXA!)p-fFF2vVM%m-p>#tbbisK{^AcG*gw zh|=ryw8}~9N_X6h$!&kV%y3YMnKV}2nKooX)0cz z`&%*?$E?hG3Ta7P`kr-LLnx>>1jpi{{Ci$yAi!A~CcLk2x155(2j+)g@r(anytKB_ zJ4r3tR6S@_TL|?x;Y(A|cONQVr2Tu-*Tl9ql~C6OZ^D4V%RsBB^Vu;sth^AP(>d6v zg`GWyiz6rpg7MVScjp@M*$7pU%sGbyaz?9vE{v1_9nX>A_a1EbK2YD|$c^!4M$K;bM&q<@vjy{7o3aYBOLR&KuUa_eDxL8(JcBy6Q_1t=y zih7%|g~F|zq)?Lu~pPXG`rov7|I&;(DE+%H8&NnbqvG1yT98;oy2 z4>amzuw%1EVASWyy&p>)aZf|EBNeoOX6v7ZemL{{$qPZIvwsfEXdVR`$Oq!cv_g*sfjzdBrwtUgp0qenUxD)_Tc$DZ??t0F}t z{OHkhC}a5kq&8x8*L?%y=5Ycek)dpuel}VUA9u*bEMbu`m%my`$$vtARFX)F99#uN zLKs^aq|}-07(M*OL@mL9L6e-K(uqKu_EYA18b=4y3Xj_S`+;i}xv9t?8QlT&1{IUf z0)3d+*%e%3;?Z}O!F^g(+kQCj!ZNVRom#NdphDlSuy%V+(hi|sMQu(ppR3vVX$FW& zQxdO*_+w_@1f57Di2-XDaz!ZneqxO!tb{@N^KP8Z7&@%9f(GmvQw`Ior3zvFOY?%~ z)CHy@V->1#b^}w@8cZ7@7n|e23?}hzekA@a9{I)k$#In^o`uz9X?=DDp{d|+8>?I`gJKuN zFQW{&H}&>A@(TKS0ZbGyBFSs(XV;sV(UV#lvbIYeWFuAZ(8L=_Fvre5|G9N3Akw8I zNke|Y7FeUX6nW^Jg%%-SdAsyNwP>Xq&u<>FX;JFJXV1`rc9J9^m$AuhBYpm_XUxS& z4<$%ttWbi^?R9T@`kwLmlB8(af67edy6SydwtO}3R~>nI;m|#Jvf2~tqg?9j9hcto za9a?Bhg>$4*-3Nmi;6`joqS++ zaU<7QPJcc&of7ll0So)-8%EZ=fXp(hE9(0qnIOvj$FN@Tt;b(?;>wodlh3=3czVoi8GKtWvm}qnEJBShNqIs$|vMWdQNWjfsbJa;@1>AaUH;#wDLJny2 zy?<|WVze@@>zEg0-|bRYs=vIO5E+-|k9fLNPw<`5(Tsb8?=LMVFTe1s(J^GLbai+U z+obPK!wphHLQ}kq^W<(=xrtaXd^?rplv5C~mTVw^V1GrwVOdnkC+X-Ym8{(J?$0w- zB*|%JMwec*tD{5ff|yt;4tL3Kr}mBliauKHfBN1tGe669O%aEX=^g32`)Fk9MH(YI zX^PN_Ueqle3M*-dRBCn(^)U=XJCm5Uwjrfl3=og%nzGe^J-2%=IGoH=!_H-mHHgeEBry=((e(Ax*-}UUE7bl|akNK9Jt%SnPk-FayL|Mr@Qt8w> zd4_^0E@?vV#DMC=<4sau{{D$$Vc00SHxn*tE=^cduuIbQeODQdU)xweU8f2E&a1_k z8ZT@+yPS9C(@9~S{eX5=4TGV7A<}m->Ryk&Fz{JZ5N-2h_)Bc=xa$k zb2ev4h&>M3MAc9`*L$BKdn6q}7gO^@$v%?5gRakrhY>2eo*e3TRa|v--Y|r6U3ZBe zE4^!7@I|~ZBbTJ%mT>o$oEYTmi2F}yow}o%D38hLo*MwMliZDyjfMlhKeJ^yePBUk z<=SvZLO!QuLqK-+-7$!x`uYY5dBs%r6yo3G?NLucr@l?cM-70-fH39c_gqEm-SZA! zIe&U<%cJaP!NzZUrGV^bGN8@X6C~S_tMM97&%R zzM3u^8+!VX#FMQ0jU#kU3#%c9V>qz8^UpF%LTY}ytC{l{KJ4YLjCmoGvBi|9j&bzaGet}h7v!j-BsOS9Q! zADMj176fd)SI!rS?#I+X?=r8p%+1fQGSds>zDMCEX4TY=9HHwQ{FB?)0YL6~`88K` z-{<9Vy8SSd!1Xz8XF?Yj;o2tPFPZh;D-E$}%08(POdkp?!^>#-)Xh(sZBC=(po=BZCQwiI{9$4m*!d|u%L5C`+! zi0ev*<%~3^moMSVN9h|a=SdO{RSXSo&9Mw|5BGvLux?ooFa#`0;0zW6nv9zOR44%S z6Zq%PpBL>QO>u=tJk~fglmHSZ0dE9&{D~k)J_YB94<9`OA94WQ1A$-xvM7Z_MYF-i zARuv|=0E`i;mX>Y0LW?tI8cE8H>`gy`~Ca(EtiM<|0qJpVtFSiv_rVZcT90lX)uOX zR`P1vi`o&fUfMSaT?=8GqVq(BW zU5>S^Zb$Z)2uno3;%wg$7TnLANdo#m?tkCDz=b$9#mp0|=oaPQuJc=`!6Op9U!C~g zGc&t5QRNDca+9KEfOwNT*|0F_-xZ4wh-%yiKB1)dGy=dL2L}g>0k@h;BmnmV_#_lS z#OZj2MMPS$;2Ck%$;^{>gRm z6SsX57gw(qk8L|aK5TRKH0&xnj@0M@hC;mXj@_Qox&_A_c&zDNYm%IUH;eY#Fd0%LlMw9+`xdkrR7B+RdsNGswL) z6p4jC&aA02ky#fy)>A&A?t`8{d&m%Sy>HHEQbPOF$gp7_q8G+N@ov%lbTU)r zbm@2TiF$`b`{FkMGy>$G3Si{e zDCc;|cX?00fhQuegocEC1{M!s~a)0Ic`!Qm8!aau!%B!qX6Wx1Jee;Qy|gr zFu)BKnAF5JY$i1{0dW8ziV8oGkmLZ8h;;xc6rgUXlq~>Z_z^q~3m6c<++_yPwA=uU z4>Ibal9R*y{b}p#>qQ<_gaO7FnpkmDrIl)FX=&;gD=W_`Y=`_nwicj!0dTcaaF6<( zHBA6SSnn=Bj9Tk*v;TQal`!=6DuMr@pjNK?FEn_|Ui6``n{*9acS@3pd5c__PtX1O z3cuqz`yQ|9x?%633F&jKIuhOSyp{aG;}L^ZK4VTzHcM!$n|hI#h+>>LPo0}1{xYNx z)qGJTfvn4o0P{6j-ZcW`ibkiVMhtyZpLwBru+d<}Ea?kCOHYu%+Ct;>M~yY>&2F7TOGqvcs>2NF=-~stL!Zik&>_^YX{V*}U-dnzj@?J)K++Uv4Jm z4LP;TcPhfPvVyFz+4}Z8xAufBlKtHY_1PKjy4=gaU-k9&s(5>o-_ART$_eZ(?!ak| zrh=~0QyGok1n$GTb$5cpX++l1<+{eN8FHEiJdMKOg|xG^&tDC{zk-E*V;P@63eKKw zO!=5mrC(*o?%hCoN%Pp9{#QgeYeVl`yocn5D`V}0p9!|$=c*rHZ@OC_iWB=rE7<7U zI@p|0+lMZP>6^muOiyWU5$GlLW@Q<>`LDx_*8&-^Cx7%l`f+UHyW{sG5Lz=qne5y9 zI!bg_kR9OI_Bz_aD|%rq*cs|omh7J}eY?Z@*KOiagud{dYevmY7^fEAe9raS!EYLf zh*)-?jF7DL(wFB?kC(w-#UtTj5|yLln$Ny+vFUt|a(f^9X#$=a_v~XJwYa|UD+N6b z0}ZY_vzB+r?^8cb+&^#XrH$!DAtLUdRDk$oB<@-}x1{BL+**8YnyBZZW*6GK*!xf* zvY*|#EGoG9pO<`M=PqX_=f$Axl14aPii2NI9#$0dP{frzt!X2%F12gZM)L`))ePYC#HC?Dy-sxT~?=I7_9r>Doq$45p+`uqE@U%!6w;>Fh1*82MT^78V+!otkV zOtDxT7Z-Qz*s(*04(;2w&(F`#!^6YL$%#&<+u7Nfo13p&w@yz_PeVh4NF?HLIN+b> zuiXFtU3$xkZY<9o3`^l*hhd}qxf%{P$1tM`3R=|NV z85oFjDnP`7$wkQ$c6#PscJ46_v8ZU3^l)azQC4L>17D<4q)^WU8#8=bBhLa5sfJ9- z?qHxUon)S2DYg||y>&XX3mEFVNhaQ6Lzl|w59!MH$j_!2=u5q0-3-jQvgF8v&P$jp zLPm9aQFE!Xvf>HZM%&0=J=Y&RXSj%J8t#D!YKCT(9^ooK>wlKwxLf4g+X6^)un%94 zfgupjlj=fbG&{Y1Dk*m&MYL@T143lNp1PssLRW~kdClQp?yiM(a$Cm77Tgu*(sAks zGjv^z9mTlN@SbLO0_Bav{aY7a-8Tm*o}q6jNy+feyuLcMA_CmDW|NK0Y9m^I=u&q= zQF!LCCtGdG?3*tb(k$&j`?t#x(=s4_!jS8K?lV(BBU45FoN}i;+JX6g`frIW=re`gDU7GFB(e=JD^!3=Hw&^H|Cj9y- za_*S+!!rdiQGK=Rm~det@8)FqAUm4wyuJUcM=-pUml#qXp#ynao&%_shIFDJJSFFw>Q&d z*tkzjqDBN9H}9?%6Fu*Lo>^n{$%B~U$}`GL@QY9>)Q9H;;!ro@AUDuuT9T~-Mx}At z^YK!Zt?$54d4li3bqyguS$Hr{(}h!0VouLchIz%sDKhI2nG|HJ@*rp}5KA2z;8`gv z$OGq#}Bm=_W z@wiw46O_coB!pu`3KJ{&)|`B&r41#6Fh%h2vs!0 z?|Gj>`s>x(u3MpB^u5Kh^Dl4Xl+|gSV@Fla2AYIU-}BuJG?+-h-u@A>)3p92To} z%80}s4CbIu4@j)XbI@M<;c{Ef|`N>D@WBcm0{yp)* z=GRO_012|pc-#lrs)n${Cc~S&(`iJaM#n zafb6WVm;O2|M7$VH`cd+$e}R142UQKAp5q-v(a}|Jqn&JnY}SF&H+V!VV>0X{g%}{ zBzJ1+ve^+W3IPMh2zJII@l5EHFj341a7mHm2s1;nPqOn%=;=imw71l~jD@Z$sLf*( zpsFyanikjkvsLKwmK1u)Metlzk{^UZxtwDGcP>^Ib#ad!zjBQ(x|)18q_HTAgHxQr z4ID<=cAmfU`t`7I@wF3Hf$$pv|B~f|IRRaWEM{Tm?w5t+@Xl^XSN_$poj-F8#)<D(KWjCl92;DS?rf`!ZzPPXZf_h zceGYI)Af8UHzOx#?dz zLv@iEX5+ctcC|R#c*C4?Z2myE5b1TgTmQf zF)Sse>^IO$Ixs@jrv$~n->#0Pnw48+Rre-I+!B72sv-b{R|~58)#S?Yn)@)ubH6_S zT`o*9!!@3Cxae}3S*g@BjqXWNR`IiwY}HPJaRZ`HZzF+QsjGA>&2X|2Ks@=-pl(zC zU$}OsnD~#Gpt@jb4_37^MUL(%O|1;(80Twmm=Y3&D6MM?Aa<3s?=%2Y;|F%@)8KX` zgP4bOA&luw1tBg$NOOPFUY)&(5G3HE4MrkeHzEX@LxxU}OdjdaUl_4aRnC)RKAZ%m zLu==ty5v<+vRTY;S)X(f^6nFZFw>9!)MaDxn*D&%qIv)%9SzQxdbBS(_?Z9vg=w?|~1e(3AFv;w0|L z**O_3sK^fma6pu-#OW9Z$W2AVr+JQSR5J!fx4Jj_r?a7UA54ey8KjeW!=*ud4!(A+ zkJIc_g069i$fz2+;}hD;1jgMe{ARi*r|!=<0}$$T-R_8qI~SlQW8J4edjU(=9xr%R zC5LS%5s%V zfemVSqWY-s#E2`14>hvq&A4%WtwF6i*6N-fYTPi-L!%w&_3!o{))aG%o{2D|zY}*a z%^m*PI5x+{0qOIEuxSh9_3!Y^sZ`blv$%noUKl5MVJuj(hET0XQk6_C#<CUY@%(04Hq01ZkB`^2d%W4`E^x{rL4b4F%EKrDjjzSn7vHKEFGSTj0R(vuWlbxL^az)1qG8u(Am@s-89jYwx zWoA@@c{Tf6lA2vJijm3;AqVVq$-B%vjX?|3P}NKU8ePt6LeNn69oL|yjJO=6J$+&v z>7HT^vr&Gmr}WZm@NEVPa6isIQ0PC)PVI!Joq=*_=!M%~DKEQ(`y!9-sX2Cd?mhX! zh|{*@%)fun8*kvRPTM=_6ZWWn)+k4dk^YwfpLV{$*u6&O*!udr;JpjDL$I*Km4h?S z&OAQmU$|WK(}^$fVzbcJYG%n6@jTgxw`pTpOJ{IrOKz4=`+m5wAS2N=8G092_s9{# zD3U3-&|uvQwkY*MRt93gy5vQ@S8--WXtm*{&6?4xJC7umR?Td|(<01u1{4(Ty8c-g zk%!XM@n1J1|ImmME1v3qBpE@k(zP;a(s!Vv^uH6um1RJa`}zsuRV z{OOtN7yF4_!atHy3H`}I(j$R)h1g!B(C83aPvQrh@W!8SM;ub0>BjE5V78TU8~}(x zIqjNhAo}_pt2?7lZ^6GH?VM*CkWKD0lq8u%Lod7^a6on97N=KZn7P_0J-v2^QmA-UxmTDi9`pCrqAdL5?8ZF z1FdW_8sv?&lmkBDmv)NQrfRikdNKHXV_3X5um`5na+_4KKHq3jIW-Xgl(dKZKUyrf zVq-u3<75Ah`@VnTK201r>)4tIIkoW9hW(n8-bbvrlw=6o{J2ZxA>_9Q?MJ#Dl0Nc| zWGer*0ue7ZI7Ad63{LlmOO<$m;Ru`)9)F6Jnajx8c{H0dz=%1*$h#KW|bHOnY_>7H# zGaqv+qfWX4&`ZY_&RfT`zq`FY_-a~Gra%O+?$bB70LqyBo$mLpZ+hi9^?x)~Itt|?>cNiR$kf#_{_K6A;l_sZynz+!L5+T!KdpH3=VpS%zZ zps=3j#XfQnL#Q)UGTg!!!OA+@Rx(``EXi(MH3mt*OdH z$SCU1=r<}6N~Te?Lzk0Qs(r7=$J>|N3R+a#$$!rTqLN|Z)8?tE*7G~NIFQ*OuOt#n zP*w;s=Q%)5_KJj{G_|n~T0gQr$|la5Ax5Pl{K0ThPdA8HH{zw^M(g^&`oBoM*HAR6ippv1QS|5SiJ5lq6-vD)7s zaUfhvG#d3dVnR;*<73FQVD9i1*|FKJ42P5IT%emHCV$3400uBdj+EP6)W%S8xY-1~ z)7V5n0g%$zSRc6_x?gDgLIO*DvbK@JeMHHdoTSXiIde`Pq(oj2lD6F$9Do3Q$8_Lx ztBt6L?m6`o1nim>KvnyGeH2I1?3i_Dqij?S?ZRK-k~x!AwxA(=75N8F4xmZ)G9ywv zSx*k)bnZA>L$5ypnMC1%JOCAxzL%{m|0XYIX;jNmM4EhmlQ&TaBuZs}>=cx>{7)$Z zS782cIArJFcRjP;LZOEH0e{~Z?dtGy)YSyy8k){@=I+r?B^o%De+v>qI8{^r z>B@xfLV`V;sJ;RNXLKrt9oGPa^;6;0#6UXf(l+o36)5 zQT*-kb^Uf)BKxX_8I85?jV7g?WbzQstnNjj7ruRDIy2=WtSa?MKVL5~aoaCj2qku>uOayO}b&nK(UxF15CfCURQQc;1}4WanU5SO9)8G6nE;NqT;BwSdIi zFQm@iQbHH}g_etOl=WPm(3s}4NKDb<%PYavTi^>Zd0rodKiXg&T24FdWZc(~p2FQ= z;WK?XM528KNN+D*&d~p)#4lz5>ayoYNrv*7Q&*exGOBEqmE=GadFfJh((}HO3J2)> zmtCZ!t8=Y6OU{)RxD2~2~t;Yc(jgjkOSfIa-DNYIPC1A$I?@HKy0!c;^Q`|$u*-l~>ke=f%K`_$vOqQs$npsA#+8$lY zg32nA4)fa1H1BKbq=#TTcGMJ}4~k*KWX;u7#a_hG{c^z#4&1=Tt>~bRmI}5Y&tuO$ z<{gfdfm7GkeWRmE!W5K^ZpUQ#yrN^N6K`~Nv^A7?Lj^TX+IhTQpSMoD0M}MtewkSp-=zwCd3ITt&8YF>ZeT3! zElR`8Ps~X!J`JwUH&c?=nruthE-xm;2a8LXevx;L_f0nf#-VlxQdWQN7tkEWlL(Q~eZ1|j;AK3n5X}P|cKxhpdB}F%sF3bdMAeB3^Nc^~ClmRr7rC~!pa@1tYBrN8x^mJE}hm%5l}AW2UVr{pSMH2A-j>%T`n zm>6hlv$9cG+%YQS8RDCx?;7!J%Cp4I+0ckPW8l_6;q!qWy*x8?cIxoL%lj@c6wbqv zDXK(_AT~aM4WM8+k%v=NS63stvQEUE^ngVLtRi&{b*gW9M%DJ}S{AI*&`3s~smx+R z`E<6w{@=S!fyjV8!s{)oTZ=@*jE zf8i;MC>WhallLKS@(hvA_bsn8gcEu=EncgWMUU_p?(c}wbwLK;!Ku?azCiW*Cm5_- zWl`k9{FskM?YGaX3qfCt)c0G9^P^iIRkSB4P1nqb047jSlyd&|`$BY#QPv7@`yoAM>{_?8F+uw$ z$qU7XqamYDPw0<-DQ*fl+Ial-*QMtlex3d?Z&lbDv0v#@cc|G_Sh7XINgWmjY}109 zrsMsBJo(%HI3Gd-vBe?{+M%)_ylR$S_fQ${kn?H2xTB+%IZ8`E^`{NrFvRVUu0$=?;a{fMpZUn`Tl&&(P?g$aJvV}=;W3yTNWxOf}`9?r^cIi z z23q;-*;SFu4jB_v(74jA(SHL{koGE`Z@-;!Q$<_1Tf6ZFqo^mL>Sk=0Q6%KkAt z2;Ab0Z#SY?(CF4jwGpNkSy&(}Wnc__?&0A*?yQH3@2zUoo)L;0Ct? z4h8ynHz%JG0`qRkRjL`}SVyZw?`T|aW@a%i#GLKy9P`qXZ_(S2axj-6t$sfnCff|2 zdDW9*@>cdJ|H9ZNuc}i*wt4P{W>TIX!Sc)18KM2=qm@sezL=v0j0m@tTtA5EN$gA? z_Mxto(OwD**Pm(V+o|O{6ecXeBmOlX4f z2w%#$o#5{bEWPY6DT!1*8T(!|!DzPSr~UZz3p{>1=hTVg-+^;#&+VOX4|i*vhizat z?0Q^p7@f9=7$8KeRRZ_F#0rNFQ$kC$_S-5MvjDNJ-fSXA9oUOp)dp$i9TjTR!7i^K zA*-q0Hd7Sh~`+}o)c)Y$( z+?CJi1D=>WrX_D>Uztet5Pvr+-rhB32tLuiQdyqqBSjF`{s?rXr$tEP!K33A!it#Q zsT9z5{bNJRI6FV|@xEb|e?|s)?EhZj{(EEqia!0zv3^OSix67dq)8JfvZp?7m*VoI zx-UP6%c+2r)Pe4$PzWhKyLKBI{*6V2M@F$hJds2qc*iqg#g(lWE{+wkKbeIgtEo{b z`0Sj#e8sF1F&k1=Q*WclcPSs!-NHl>dwSLQ1B{E8 z6rko(7GCwfI{6V3Tc3|DMy{SlVA9O_mrVSSVj|-$10+yq-n|3~(tSL9z-A(5jqr?Y zO&ZzSWpT=nCr7M_XH9W;!>b+a^uR`AnimrgLB@ERr3KHy^!P9_UWI*+C&H*%g?25? z)Do9}5-d^Fi8C)nL4@_DAW25DJgr8dXtWD^F{^xR`AcaZ-FVf^41eeFoHQhBR)XUq z4h-xn-ED%!aM7V1Z2?M6ou2336@X+DE#Lq^Pq`fNGInrOJ_K9~P$U|k-XA`Oq1wn@ z--#H>VLZ2a_)iZPVaraH+x2(lA5;o*lOy{f&^$y*S)p*`lTDk|7RV}m+6?UZ)eMY% ztDQ_c7ZNw%rsJMeZ7}3}lcPPlvF&QHwX$ydDVv{$zy0Qt3*es7NMys2BU*Z))|;v7~DFQRpSu@8%q24%xljgx(wIb6_qM) zk6*6VGsu21OH|QRnN>CXy3)w4S(b{^lDV)Q<3UY25Mn~{oI3|%<&_4tVf`$#uCj8pM`A6Fvq G(|-Y9t#!u$ literal 0 HcmV?d00001 diff --git a/kurento-recorder/static/img/transparent-1px.png b/kurento-recorder/static/img/transparent-1px.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/kurento-recorder/static/img/urjc.gif b/kurento-recorder/static/img/urjc.gif new file mode 100644 index 0000000000000000000000000000000000000000..cd8a7703ae9ab79619a008faf54268597c122648 GIT binary patch literal 16756 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 H!e9*m8KQaw literal 0 HcmV?d00001 diff --git a/kurento-recorder/static/img/webrtc.png b/kurento-recorder/static/img/webrtc.png new file mode 100644 index 0000000000000000000000000000000000000000..d47e2e4cb3aa08c20d1c0ae0a2997633df1b79aa GIT binary patch literal 12375 zcmdsdXH-+swr(g2f{I8J0qI3rM4EI20g>Jey;mur_o^aIKtOsEP^y4*sR3ysy>~+I zEffPJA#dm0`|G`X&%Ni3JKm4S7<+7zwdPuD&iQ@cntNwOX{syTA$dpw0)g%*zkHz$ z0^x^(KzPf~DFyDr17&1A0D(v}9OUISHSM9EP!D^kE0eOk zJd>+C)Yiet1_bh*%hs{e)!CtzLN1-jsYHf;R)K0$5i@Da#e`BOaBwr!RxX_POTD-TTNoI)Fne*e`6+}k=L9GN7I8L=7HwUllrlq&OpJvw# z6SWiHPI)P)B^-LYMD7v!^1I%yo|Sce*)S3|SI|A;8f#_`3@aY!B3M$AhozmU4TR@A zPD%`FSIcaFLLY%8+m%Z<#tVIq*Y26{Oocd<5+v&%CszoPRm2O;PUFx4eIW#y_gh)6 zfi(F*=A0p$LiQuWYx5W)aD!p2= zkxfh?%!ruJjR*qaf5bJUOv6JdVu5dwAQ1yC4ma?_7vkgbhlz? zNF=WQt{LAh>?W4Q(sJ#3W4O#!76e-H3?9Aa1=lA5WitV~LVWeB8}G zhP7UW^P&i(;liLFZ=~@868MTutO)+9aNg7RY+pr!Kqt-6jtMSef>8T+E5kn6BN>d+ z7j{snt#YCp2xR(#jbHaqjZ7~w2=wAh8269obY~q8c-wE%cidR$AVr&tyq9C^`XzTy zj>I~Y-rfB1_qTFf9|nIgaGQfCWEq6owd_A6x!&dfrT6o$lq=bl1#wOXS4-F}!sow< zDJ+=hBJnJv^;zSHY0|?lm^)q)-j88p>Wie*Vo^yDekq_Gt;?kMlHo+k9bYWMSg|QV z;y38&Tl9w(C4tXj)ml;$x9j8^i$x#4SIj3JvGx?mh^PLNIpSXXQ0k*d-quK&J=t8m zw0!TA_U#8mf?ZBe_X7oQSwhY8$aPISAEqTyFaEl=AzBI!&{Om^ztEVQs11lV>OZ3XI>_r-{I@o z>z(U@>vZePCq^XMma=YNFLYM9wEw($MZ0ltLulisP1@7vdIcHUi^X}mRoT79T#op1EL3Zv_20i(^Ly-$75)Fb)Sd|?4@m`lchuT^ttP~1E~`JkR-oK=18XF z2J4oT7M3oRlIor6_3Or$nCb*oDC!C7td-oFNGa1R&DPx0q0_M|ktmKRwJV0|%6ttr zz(n0N=v3|0kpHUnrOIrrrH6^sinhj=m)Y@7*$1yM;VzD?&dTMLvxH&X-S@# zyx=QANR9UCXImMfwKTVjEKl`YTURgE^Jk3Hb8~lect_<03?spB`gyyh1^ zFqfjkw4656&>U50(UM>5))jpa7^91EzA8Fbx~+e+<~G~S`P)MeB)f&(ppp#W-g$(U zyh*35{5Okai`13(35}zY1(S-giew)hdW_fD)|`8sdkQ#iaxinKsO_p9W@xK57CtVN zP?b>a9UK_UADl`T&Xf|Ee!7*pl{uXWZ!kCXHRP=?uK#JHT)l2sXmD8H;u3BsX7Ej4 z&(Nesu{^t+eX6;d`giP zM>NuZrQLJaq}L=xm!2*em<@=wH~ens*XV@in1#dTLs+raSbyv&s3?>j&yFA}?0J|G zKI+0hkQo*yBR+5Qw|e&A`NuDf irzb${e(NWH9|9k&aIWuxAZ75;L;cmEQ@b=UQ zk;SG(OlROuwI~#~CY%uDNSV~zA&)~s8&7b*C zqFG0|*n|7O?yn@)fBT>U;bYL>Z2kU5tXk5|Z=Ph0>ITn;*EhdQ{*12YcAnHIJAkBC z1h;bdt2u_5cKmtUQHSTaN2*7%5gxR+FnwU6p$|5I*I8VB$flE~ii)nFoTo{p3Yp|E^~`0Lt(^S=u7;M75` z`Q~@^@{I*B$)7DYMSVkq5;D49bl5*3hhtM8?_)Y(tU07 zdU$$jleUvKC}mU)Ql=uRbmt-ksLo*sPvaR@WDP>pRF>aO9&q;&a{~1HP{ijWc>P*fD_L$Yq>lC}!$p zpo}bynluKaN2hj|{LxDDjAU6tk_LXSPIdbn=62qWC)u40f6PwK4hrVKTri){uMgO= z8iKzegB~^A^IREIz{YGzv`7pYpZxSZsh;1Ufc%7HREnE9?|SY^UMG!f^fqTTXH+yA zJ2oErx7G#NB6sL=M28m7TKy2z*r~}JF{#DYQ-3J38+i_=UJQ2U#0>Q}&-!p4mbYlM zn4QTUJfD?cjF^-$x?Y$$S_pa5?(^kzbU_JuGyL7~b;5Z(nf#6T^!WY{cRuXpJd+j^ zTa|Ig?4XO}hpmS>a%iseulp-#sKLP(lY7%cqiLggsVAvPFz3K;nBDe0+RFK!UpD=j;A9%>flMJ>So_PWbDfbQR1$4c5|)r4?G$Y#$Tttvn@mXJ=BI?=`elvv=$$E|5&UqmO^Kop5(4f1|jd;#To*A*s%uh0p|I}pA+fk z;aANkfBai*g;Hvphow>btb650r)AukgSG^qP_cqJ77*xOCrY&KN;+wMC1RN)qkCk|7a=yy48O#`TzS| z|8CWOqi~7^v>DwQ;Dept(m0G$sW4zXr3ObuMygDq=eGc8nNy1kKcxiAT-&41a=m+3 zTASC--^o0_NQabC3=#2B4?g#E-s$gi(A>m=eR0HVQ-*c(FzX9Rn~Weyz5 zTUO-V2BGL+Uf4AauRf4$UCRrppd%?e=S{w3+@vzdzG0H*xQ4entn!F6Yzt=&wqJ$^ z<$<%ULI@(~gl-edhMw9iUj|j}t@(VNgH`Ho@|oVxZ1c?>l{J6u@$iB9YyUjdweJ~Z zNumHjgV>B*gEuS~CkEZd8=_$iZU6oeCWS>*oJuo7Vdtz>h;gL9e5gS$F%#2up#WI0 z>WEpkgcgs`HWs&doTb}o9nh&~9*T(+B?cJx&GU^lmv|h6 zztOf;lq8MH3IC>TxCtYyfMpFTsSZOa`S>LPSk&YOhwP13XDv5=zL^8J3z0RS`f=+) zv9Cl3!bC8*DYYc6!B<&G=DLg1NZPd*=T}h(8-5$YTaaY~@6Xn$FW&aguFb?=>Gr7iah= zOz^i2{Q<;j`Io2fwzVW;m;iCn23hUy>?K(Wxn8nc%V*_eVObsX6Lz~qXZ&ob5TTyX z)mz`ogqTpB(@b_H&durT8Zn$kV4?I!Sgq3DDc%+i{w7bA30s%QT|bDv0pR3-3(E9i z9Lk&VV-WZb&H2yWJgm>=>9l%mk7JSITKY4p)ZxmgNm6iWT0%#RqvL9|U!7LS=){)Y z+03bc|NdoUstiqCOl6E86qA;K!<`2wnncXgQs{2BugCat)0Ll=SwOJ2jj5&%12j_x zOr3mjsSz(pTcl+89tdjK?AmtJ=uapz%-8oQ&q2-3b9Pee^h77B0p|Ti=z3*x4G|Z! z)h)r_X0K?rc5+G6ebRIyz2!?hWb`*v3t8WsUus*GOnNU=cEb;GT(#}H9DXw55KWga}AD+8^-c!Ym%9d$JQ(v7mWo^@lu6 zCkp0Hxcrj>47Xwf0N8%%0iYuAq|Hu6`~(tBj4leJKq!hx9BfsV_Y3hA_SjlntnC`=7UaR>oVKMyxb|t?cx&{! zDEMmf8RA502^{g8Fiy;;>W==bGm-@%Cg>zwU2+{StuK zh8Ks3TW0YK$4aBl~qBHlV1+^)2Xb)xxv^wb5~^7qF-8vR;)FZAj8J9hLo^W9B*efB4w zb4J_*Mtl?y?As+*tXV_^vtb4}&(#_vLtAx^dt!S}!;l#8@6}OvrxM@$S9fGHL-Fv4 zKg)}OQ9WnYO0h%uK<_GmUq-}K6z7Xt1T4L7DeznPlN<3LbD{&3G`cjZt=Ka+(H}I7e&7a$UM4opxMMcPGkRvW zcOHnJp|gy<gzr86+7FtcF4`j_dIVxYn72MbFw%ECs7aFzutEIJL+4 zWpAi^-!@=NRA6|32>U_!%^qN{F=f$lu&U8<>Lr*s`D{L`>-8TE#lc^WypjNRwt7+U z^Aug8@JQGgz{L+5y$Y!!M)rUk+!FY`iWjecO8m4l+^0#%A;=8Ik-chT+ zLiH#Pi))x4tnOKk&cWOoMS)c$I|3p5xfLgj<3g2vu-a{UbXd6dSEU~HR==;%&LXQ7 ziKeVQocsI709DxAE^=trAX`D4DU&nk%&DCu;n5IRx4_DZK@PJoPQd>1#aLZ(iM#b)tNWrass7t(&e7v1B%!} zXl|&~c6mt}OnJQBH*Gb23Qrre%B2bg5@-7^iYVl3<5Ah-Jb3%U@#y*mz0~E^=SSE- zznOU`fy9vVfLK`+|4LIvw4vu|7G5s%utwy!q9{hOyYYq6u@(RqatcDj5(CzL_bbS3 zZnyQWe#2G^P?y90ah1|cVtI|(lCsI(YGXWztAH+01j)=X#PAzEis3hT zEzo~jiESTkmvsONChjE#6-bKn930(?TFb=xhMZyS8*bbI3W`?(N6~fc*-Lx95thjD zc*SY>B1J?Tx(go=rgl%hpKq+Rirzl{s>>Q$$;cR8iM%!lY~31OJztZLLY9?QWUZ}D znN)R<+#r@UKTJO)Ue05ciK>7#b9&2Q?3a!uD6+grc|8GKQqnl>y%NXQ_vvnWEOofv zVYk|CVipaD*Ax`@>P=4Q4pck++<)_rp#FhCR)hX>**6#NAI>EG=}q zt6uv2dRMxeQCyyBCeZIbX#+9H1E{atrv0c^Yv2-#ONM-N8$BnPw8s<@ZlFh@VWUx$ zi42e7eq$igq5uLEGwsH1g+5K43WPF9;Zqh?na?Bv`L}AV)6ElZ<+h%gs}a~{iGQ3= zLekzaVdg^d1W5F()#w#j&qxJWEkImZ2^7!37?)>a7S~~7#_fBn@s3^{qV8EbzbUw) zGR?*pvm0Wk@DIFNi(p z!Zd?rfaQ2ygFymL$?~zrDHU9Om!MuzJVq=c=fNyW^W%Py{j2d=Z9N(+UjXk>5Vc8D zi)9MDiASW%XcyeTf)gqe{!4R5dMx8OX*+I4$Hjy3yL~>dC)XKnWHq>IDI8#tD|-!w zVWHI}^~9m>2CkDm`Ejd*8zZS9&DL9#3)*_AzDD0-uN(1+0j~`lXO*PQ&iv4SHnR1E ztMYai?l5}MOhX2?;rUH5YZY|YzoQ9&%>OL~u$U73qt0@3YiRef>PhKPpoyLd#W~bO zOW+hY<4cfY}U9NN3O$FmkW6|O~v>PLuLNJF^AwaeJ>|zt)o!M)%1OiNh5L#0Hy);guY)c8V!Na{-4ZV|U!oY|L*U;AjB4sR#o#ic#Z@_ezK~xEs z{CjEE$U-(?5LI;D;#E;q@u4LT367|O_(cKM$DVws-&oeoTJ5R2hd)({2& z)W(VA9XBA(AG@dFA{*nwXVS>nnRB%0DqyY_U`jn{LN96(U?gPXk>r5}z`&GRfO-^z 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 literal 0 HcmV?d00001 diff --git a/kurento-recorder/static/index.html b/kurento-recorder/static/index.html new file mode 100644 index 00000000..dad9bbe3 --- /dev/null +++ b/kurento-recorder/static/index.html @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Kurento Tutorial 1: Hello World + + + +

+ +
+ +
+ +
+
+

Local stream

+ +
+
+ + Start +
+
+ + Stop +
+
+

Remote stream

+ +
+
+
+
+

+
+
    +
    +
    +
    +
    + + + + + diff --git a/kurento-recorder/static/js/index.js b/kurento-recorder/static/js/index.js new file mode 100644 index 00000000..58aba3f1 --- /dev/null +++ b/kurento-recorder/static/js/index.js @@ -0,0 +1,188 @@ +/* + * (C) Copyright 2014-2015 Kurento (http://kurento.org/) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +var ws = new WebSocket('wss://' + location.host + '/helloworld'); +var videoInput; +var videoOutput; +var webRtcPeer; +var state = null; + +const I_CAN_START = 0; +const I_CAN_STOP = 1; +const I_AM_STARTING = 2; + +window.onload = function() { + console = new Console(); + console.log('Page loaded ...'); + videoInput = document.getElementById('videoInput'); + videoOutput = document.getElementById('videoOutput'); + setState(I_CAN_START); +} + +window.onbeforeunload = function() { + ws.close(); +} + +ws.onmessage = function(message) { + var parsedMessage = JSON.parse(message.data); + console.info('Received message: ' + message.data); + + switch (parsedMessage.id) { + case 'startResponse': + startResponse(parsedMessage); + break; + case 'error': + if (state == I_AM_STARTING) { + setState(I_CAN_START); + } + onError('Error message from server: ' + parsedMessage.message); + break; + case 'iceCandidate': + webRtcPeer.addIceCandidate(parsedMessage.candidate) + break; + default: + if (state == I_AM_STARTING) { + setState(I_CAN_START); + } + onError('Unrecognized message', parsedMessage); + } +} + +function start() { + console.log('Starting video call ...') + + // Disable start button + setState(I_AM_STARTING); + showSpinner(videoInput, videoOutput); + + console.log('Creating WebRtcPeer and generating local sdp offer ...'); + + var options = { + localVideo: videoInput, + remoteVideo: videoOutput, + onicecandidate : onIceCandidate + } + + webRtcPeer = kurentoUtils.WebRtcPeer.WebRtcPeerSendrecv(options, function(error) { + if(error) return onError(error); + this.generateOffer(onOffer); + }); +} + +function onIceCandidate(candidate) { + console.log('Local candidate' + JSON.stringify(candidate)); + + var message = { + id : 'onIceCandidate', + candidate : candidate + }; + sendMessage(message); +} + +function onOffer(error, offerSdp) { + if(error) return onError(error); + + console.info('Invoking SDP offer callback function ' + location.host); + var message = { + id : 'start', + sdpOffer : offerSdp + } + sendMessage(message); +} + +function onError(error) { + console.error(error); +} + +function startResponse(message) { + setState(I_CAN_STOP); + console.log('SDP answer received from server. Processing ...'); + webRtcPeer.processAnswer(message.sdpAnswer); +} + +function stop() { + console.log('Stopping video call ...'); + setState(I_CAN_START); + if (webRtcPeer) { + webRtcPeer.dispose(); + webRtcPeer = null; + + var message = { + id : 'stop' + } + sendMessage(message); + } + hideSpinner(videoInput, videoOutput); +} + +function setState(nextState) { + switch (nextState) { + case I_CAN_START: + $('#start').attr('disabled', false); + $('#start').attr('onclick', 'start()'); + $('#stop').attr('disabled', true); + $('#stop').removeAttr('onclick'); + break; + + case I_CAN_STOP: + $('#start').attr('disabled', true); + $('#stop').attr('disabled', false); + $('#stop').attr('onclick', 'stop()'); + break; + + case I_AM_STARTING: + $('#start').attr('disabled', true); + $('#start').removeAttr('onclick'); + $('#stop').attr('disabled', true); + $('#stop').removeAttr('onclick'); + break; + + default: + onError('Unknown state ' + nextState); + return; + } + state = nextState; +} + +function sendMessage(message) { + var jsonMessage = JSON.stringify(message); + console.log('Senging message: ' + jsonMessage); + ws.send(jsonMessage); +} + +function showSpinner() { + for (var i = 0; i < arguments.length; i++) { + arguments[i].poster = './img/transparent-1px.png'; + arguments[i].style.background = 'center transparent url("./img/spinner.gif") no-repeat'; + } +} + +function hideSpinner() { + for (var i = 0; i < arguments.length; i++) { + arguments[i].src = ''; + arguments[i].poster = './img/webrtc.png'; + arguments[i].style.background = ''; + } +} + +/** + * Lightbox utility (to display media pipeline image in a modal dialog) + */ +$(document).delegate('*[data-toggle="lightbox"]', 'click', function(event) { + event.preventDefault(); + $(this).ekkoLightbox(); +}); From 145be7c8d9cf94fac1d72bf03474d6ab3935b109 Mon Sep 17 00:00:00 2001 From: Hyunsu Date: Tue, 17 Oct 2017 16:45:42 +0900 Subject: [PATCH 02/12] server logic. stop, play remain --- kurento-recorder/server.js | 62 ++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 12 deletions(-) diff --git a/kurento-recorder/server.js b/kurento-recorder/server.js index fba5dae6..89fd77f5 100755 --- a/kurento-recorder/server.js +++ b/kurento-recorder/server.js @@ -29,7 +29,8 @@ var https = require('https'); var argv = minimist(process.argv.slice(2), { default: { as_uri: 'https://localhost:8443/', - ws_uri: 'ws://localhost:8888/kurento' + ws_uri: 'ws://localhost:8888/kurento', + file_uri: 'file:///tmp/recorder_demo.webm', // file to be stored in media server } }); @@ -179,7 +180,13 @@ function start(sessionId, ws, sdpOffer, callback) { return callback(error); } - createMediaElements(pipeline, ws, function(error, webRtcEndpoint) { + var elements = + [ + {type: 'RecorderEndpoint', params: {uri : args.file_uri}}, + {type: 'WebRtcEndpoint', params: {}} + ]; + + createMediaElements(elements, pipeline, ws, function(error, elements) { if (error) { pipeline.release(); return callback(error); @@ -192,13 +199,16 @@ function start(sessionId, ws, sdpOffer, callback) { } } - connectMediaElements(webRtcEndpoint, function(error) { + var recorder = elements[0]; + var webRtc = elements[1]; + + connectMediaElements(kurentoClient, webRtc, webRtc, recorder, function(error) { if (error) { pipeline.release(); return callback(error); } - webRtcEndpoint.on('OnIceCandidate', function(event) { + webRtc.on('OnIceCandidate', function(event) { var candidate = kurento.getComplexType('IceCandidate')(event.candidate); ws.send(JSON.stringify({ id : 'iceCandidate', @@ -206,7 +216,7 @@ function start(sessionId, ws, sdpOffer, callback) { })); }); - webRtcEndpoint.processOffer(sdpOffer, function(error, sdpAnswer) { + webRtc.processOffer(sdpOffer, function(error, sdpAnswer) { if (error) { pipeline.release(); return callback(error); @@ -214,34 +224,43 @@ function start(sessionId, ws, sdpOffer, callback) { sessions[sessionId] = { 'pipeline' : pipeline, - 'webRtcEndpoint' : webRtcEndpoint + 'webRtcEndpoint' : webRtc, + 'recorder' : recorder } return callback(null, sdpAnswer); }); - webRtcEndpoint.gatherCandidates(function(error) { + webRtc.gatherCandidates(function(error) { if (error) { return callback(error); } }); + + recorder.record(function(error) { + if (error) return onError(error); + + console.log("record"); + + }); + }); }); }); }); } -function createMediaElements(pipeline, ws, callback) { - pipeline.create('WebRtcEndpoint', function(error, webRtcEndpoint) { +function createMediaElements(elements, pipeline, ws, callback) { + pipeline.create(elements, function(error, elements) { if (error) { return callback(error); } - return callback(null, webRtcEndpoint); + return callback(null, elements); }); } -function connectMediaElements(webRtcEndpoint, callback) { - webRtcEndpoint.connect(webRtcEndpoint, function(error) { +function connectMediaElements(client, webRtc1, webRtc2, recorder, callback) { + client.connect(webRtc1, webRtc2, recorder, function(error) { if (error) { return callback(error); } @@ -252,11 +271,29 @@ function connectMediaElements(webRtcEndpoint, callback) { function stop(sessionId) { if (sessions[sessionId]) { var pipeline = sessions[sessionId].pipeline; + var webRtcEndpoint = sessions[sessionId].webRtcEndpoint; + var recorder = sessions[sessionId].recorder; + console.info('Releasing pipeline'); pipeline.release(); delete sessions[sessionId]; delete candidatesQueue[sessionId]; + + // stopRecordButton.addEventListener("click", function(event){ + recorder.stop(); + pipeline.release(); + // webRtcPeer.dispose(); + // videoInput.src = ""; + // videoOutput.src = ""; + + // hideSpinner(videoInput, videoOutput); + + // var playButton = document.getElementById('play'); + // playButton.addEventListener('click', startPlaying); + // }) + + } } @@ -278,3 +315,4 @@ function onIceCandidate(sessionId, _candidate) { } app.use(express.static(path.join(__dirname, 'static'))); + From 40a2abd0666e28d919b1268e95189fc7f5561380 Mon Sep 17 00:00:00 2001 From: tony Date: Tue, 17 Oct 2017 18:08:27 +0900 Subject: [PATCH 03/12] recorder html --- kurento-recorder/static/index.html | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/kurento-recorder/static/index.html b/kurento-recorder/static/index.html index dad9bbe3..39278bb8 100644 --- a/kurento-recorder/static/index.html +++ b/kurento-recorder/static/index.html @@ -22,7 +22,7 @@ - Kurento Tutorial 1: Hello World + Kurento Tutoria: Recorder @@ -47,19 +47,25 @@
    @@ -74,6 +80,10 @@

    Local stream


    Stop +
    +
    + Play

    Remote stream

    From 3e749daecde5fc574fe9e831fdf4ac8b12169dd6 Mon Sep 17 00:00:00 2001 From: tony Date: Tue, 17 Oct 2017 18:42:39 +0900 Subject: [PATCH 04/12] change json --- kurento-recorder/package.json | 2 +- kurento-recorder/server.js | 2 +- kurento-recorder/static/bower.json | 8 +++++--- kurento-recorder/static/js/index.js | 10 ++++++++++ 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/kurento-recorder/package.json b/kurento-recorder/package.json index 7efe9ec7..7e283485 100644 --- a/kurento-recorder/package.json +++ b/kurento-recorder/package.json @@ -1,5 +1,5 @@ { - "name": "kurento-hello-world", + "name": "kurento-recorder", "version": "6.6.1", "private": true, "scripts": { diff --git a/kurento-recorder/server.js b/kurento-recorder/server.js index 89fd77f5..e00691d4 100755 --- a/kurento-recorder/server.js +++ b/kurento-recorder/server.js @@ -182,7 +182,7 @@ function start(sessionId, ws, sdpOffer, callback) { var elements = [ - {type: 'RecorderEndpoint', params: {uri : args.file_uri}}, + {type: 'RecorderEndpoint', params: {uri : argv.file_uri}}, {type: 'WebRtcEndpoint', params: {}} ]; diff --git a/kurento-recorder/static/bower.json b/kurento-recorder/static/bower.json index afe97009..97cf4853 100644 --- a/kurento-recorder/static/bower.json +++ b/kurento-recorder/static/bower.json @@ -1,6 +1,7 @@ { - "name": "kurento-hello-world", - "description": "Kurento Browser JavaScript Tutorial", + "name": "kurento-recorder", + "version": "6.6.2-dev", + "description": "Kurento demo with Recorder", "authors": [ "Kurento " ], @@ -23,6 +24,7 @@ "bootstrap": "~3.3.0", "ekko-lightbox": "~3.3.0", "demo-console": "1.5.1", - "kurento-utils": "6.6.2" + "kurento-client": "master", + "kurento-utils": "master" } } diff --git a/kurento-recorder/static/js/index.js b/kurento-recorder/static/js/index.js index 58aba3f1..78ecc16e 100644 --- a/kurento-recorder/static/js/index.js +++ b/kurento-recorder/static/js/index.js @@ -120,6 +120,8 @@ function stop() { if (webRtcPeer) { webRtcPeer.dispose(); webRtcPeer = null; + videoInput.src = ""; + videoOutput.src = ""; var message = { id : 'stop' @@ -127,8 +129,16 @@ function stop() { sendMessage(message); } hideSpinner(videoInput, videoOutput); + var playButton = document.getElementById('play'); + playButton.addEventListener('click', startPlaying); } +function startPlaying() +{ + console.log("Start playing"); + + +} function setState(nextState) { switch (nextState) { case I_CAN_START: From 121c011ab4bdf070294d33db01ea456ee4e65f0b Mon Sep 17 00:00:00 2001 From: tony Date: Wed, 18 Oct 2017 10:35:05 +0900 Subject: [PATCH 05/12] bug fix --- kurento-recorder/server.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/kurento-recorder/server.js b/kurento-recorder/server.js index e00691d4..5fee5d0d 100755 --- a/kurento-recorder/server.js +++ b/kurento-recorder/server.js @@ -187,6 +187,10 @@ function start(sessionId, ws, sdpOffer, callback) { ]; createMediaElements(elements, pipeline, ws, function(error, elements) { + + var recorder = elements[0]; + var webRtc = elements[1]; + if (error) { pipeline.release(); return callback(error); @@ -195,12 +199,9 @@ function start(sessionId, ws, sdpOffer, callback) { if (candidatesQueue[sessionId]) { while(candidatesQueue[sessionId].length) { var candidate = candidatesQueue[sessionId].shift(); - webRtcEndpoint.addIceCandidate(candidate); + webRtc.addIceCandidate(candidate); } } - - var recorder = elements[0]; - var webRtc = elements[1]; connectMediaElements(kurentoClient, webRtc, webRtc, recorder, function(error) { if (error) { From ed597024d9ac1aca3503aec4c4c92d9604389738 Mon Sep 17 00:00:00 2001 From: tony Date: Wed, 18 Oct 2017 10:46:11 +0900 Subject: [PATCH 06/12] bug fix --- kurento-recorder/server.js | 1 - 1 file changed, 1 deletion(-) diff --git a/kurento-recorder/server.js b/kurento-recorder/server.js index 5fee5d0d..4af8841f 100755 --- a/kurento-recorder/server.js +++ b/kurento-recorder/server.js @@ -276,7 +276,6 @@ function stop(sessionId) { var recorder = sessions[sessionId].recorder; console.info('Releasing pipeline'); - pipeline.release(); delete sessions[sessionId]; delete candidatesQueue[sessionId]; From f9df1784ae8e96f813b51832d47b89b82e689a66 Mon Sep 17 00:00:00 2001 From: tony Date: Wed, 18 Oct 2017 12:02:19 +0900 Subject: [PATCH 07/12] play base code --- kurento-recorder/server.js | 54 ++++++++++++++++++++++------- kurento-recorder/static/js/index.js | 36 +++++++++++++++++-- 2 files changed, 74 insertions(+), 16 deletions(-) diff --git a/kurento-recorder/server.js b/kurento-recorder/server.js index 4af8841f..707ae889 100755 --- a/kurento-recorder/server.js +++ b/kurento-recorder/server.js @@ -124,6 +124,22 @@ wss.on('connection', function(ws) { }); break; + case 'play': + sessionId = request.session.id; + play(sessionId, ws, message.sdpOffer, function(error, sdpAnswer) { + if (error) { + return ws.send(JSON.stringify({ + id : 'error', + message : error + })); + } + ws.send(JSON.stringify({ + id : 'playResponse', + sdpAnswer : sdpAnswer + })); + }); + break; + case 'stop': stop(sessionId); break; @@ -203,7 +219,7 @@ function start(sessionId, ws, sdpOffer, callback) { } } - connectMediaElements(kurentoClient, webRtc, webRtc, recorder, function(error) { + connectMediaElementsWithRecorder(kurentoClient, webRtc, webRtc, recorder, function(error) { if (error) { pipeline.release(); return callback(error); @@ -250,6 +266,10 @@ function start(sessionId, ws, sdpOffer, callback) { }); } +function play(sessionId, ws, sdpOffer, callback) { + +}; + function createMediaElements(elements, pipeline, ws, callback) { pipeline.create(elements, function(error, elements) { if (error) { @@ -260,7 +280,26 @@ function createMediaElements(elements, pipeline, ws, callback) { }); } -function connectMediaElements(client, webRtc1, webRtc2, recorder, callback) { +function createMediaElementsWithOption(elements, option, pipeline, ws, callback) { + pipeline.create(elements, option,function(error, elements) { + if (error) { + return callback(error); + } + + return callback(null, elements); + }); +} + +function connectMediaElements(webRtcEndpoint, callback) { + webRtcEndpoint.connect(webRtcEndpoint, function(error) { + if (error) { + return callback(error); + } + return callback(null); + }); +} + +function connectMediaElementsWithRecorder(client, webRtc1, webRtc2, recorder, callback) { client.connect(webRtc1, webRtc2, recorder, function(error) { if (error) { return callback(error); @@ -280,20 +319,9 @@ function stop(sessionId) { delete sessions[sessionId]; delete candidatesQueue[sessionId]; - // stopRecordButton.addEventListener("click", function(event){ recorder.stop(); pipeline.release(); - // webRtcPeer.dispose(); - // videoInput.src = ""; - // videoOutput.src = ""; - - // hideSpinner(videoInput, videoOutput); - - // var playButton = document.getElementById('play'); - // playButton.addEventListener('click', startPlaying); - // }) - } } diff --git a/kurento-recorder/static/js/index.js b/kurento-recorder/static/js/index.js index 78ecc16e..c67853e6 100644 --- a/kurento-recorder/static/js/index.js +++ b/kurento-recorder/static/js/index.js @@ -45,6 +45,9 @@ ws.onmessage = function(message) { case 'startResponse': startResponse(parsedMessage); break; + case 'playResponse': + playResponse(parsedMessage); + break; case 'error': if (state == I_AM_STARTING) { setState(I_CAN_START); @@ -114,6 +117,12 @@ function startResponse(message) { webRtcPeer.processAnswer(message.sdpAnswer); } +function playResponse(message) { + setState(I_CAN_STOP); + console.log('SDP answer received from server. Processing ...'); + webRtcPeer.processAnswer(message.sdpAnswer); +} + function stop() { console.log('Stopping video call ...'); setState(I_CAN_START); @@ -133,11 +142,32 @@ function stop() { playButton.addEventListener('click', startPlaying); } -function startPlaying() -{ - console.log("Start playing"); +function onPlayOffer(error, offerSdp) { + if(error) return onError(error); + + console.info('Invoking play offer callback function ' + location.host); + var message = { + id : 'play', + sdpOffer : offerSdp + } + sendMessage(message); +} + +function startPlaying() { + console.log('Playing video call ...') + + // Disable start button + setState(I_AM_PLAYING); + showSpinner(videoOutput); + var options = { + remoteVideo: videoOutput + } + webRtcPeer = kurentoUtils.WebRtcPeer.WebRtcPeerRecvonly(options, function(error) { + if(error) return onError(error); + this.generateOffer(onPlayOffer); + }); } function setState(nextState) { switch (nextState) { From 2e226cc7e4c7e855e21acc14314d9c740fe916d6 Mon Sep 17 00:00:00 2001 From: tony Date: Wed, 18 Oct 2017 12:07:21 +0900 Subject: [PATCH 08/12] index js add state about play --- kurento-recorder/static/js/index.js | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/kurento-recorder/static/js/index.js b/kurento-recorder/static/js/index.js index c67853e6..fa3f6fb7 100644 --- a/kurento-recorder/static/js/index.js +++ b/kurento-recorder/static/js/index.js @@ -24,6 +24,8 @@ var state = null; const I_CAN_START = 0; const I_CAN_STOP = 1; const I_AM_STARTING = 2; +const I_AM_PLAYING = 3; +const I_CAN_STOP_PLAYING = 4; window.onload = function() { console = new Console(); @@ -118,7 +120,7 @@ function startResponse(message) { } function playResponse(message) { - setState(I_CAN_STOP); + setState(I_CAN_STOP_PLAYING); console.log('SDP answer received from server. Processing ...'); webRtcPeer.processAnswer(message.sdpAnswer); } @@ -190,7 +192,24 @@ function setState(nextState) { $('#stop').attr('disabled', true); $('#stop').removeAttr('onclick'); break; + case I_AM_PLAYING: + $('#start').attr('disabled', true); + $('#start').removeAttr('onclick'); + $('#stop').attr('disabled', true); + $('#stop').removeAttr('onclick'); + $('#play').attr('disabled', true); + $('#play').removeAttr('onclick'); + + break; + case I_CAN_STOP_PLAYING: + $('#start').attr('disabled', true); + $('#start').removeAttr('onclick'); + $('#stop').attr('disabled', true); + $('#stop').removeAttr('onclick'); + $('#play').attr('disabled', false); + $('#play').attr('onclick', 'startPlaying()'); + break; default: onError('Unknown state ' + nextState); return; From 58e20bf498e7ffbf02d49c6a6bb69a204a1ac727 Mon Sep 17 00:00:00 2001 From: tony Date: Wed, 18 Oct 2017 12:20:24 +0900 Subject: [PATCH 09/12] record play logic in serveR --- kurento-recorder/server.js | 85 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 82 insertions(+), 3 deletions(-) diff --git a/kurento-recorder/server.js b/kurento-recorder/server.js index 707ae889..95c1922f 100755 --- a/kurento-recorder/server.js +++ b/kurento-recorder/server.js @@ -267,8 +267,87 @@ function start(sessionId, ws, sdpOffer, callback) { } function play(sessionId, ws, sdpOffer, callback) { + if (!sessionId) { + return callback('Cannot use undefined sessionId'); + } -}; + getKurentoClient(function(error, kurentoClient) { + if (error) { + return callback(error); + } + + kurentoClient.create('MediaPipeline', function(error, pipeline) { + if (error) { + return callback(error); + } + + createMediaElements('WebRtcEndpoint', pipeline, ws, function(error, webRtcEndpoint) { + if (error) { + pipeline.release(); + return callback(error); + } + + if (candidatesQueue[sessionId]) { + while(candidatesQueue[sessionId].length) { + var candidate = candidatesQueue[sessionId].shift(); + webRtcEndpoint.addIceCandidate(candidate); + } + } + + var options = {uri : argv.file_uri} + createMediaElementsWithOption('PlayerEndpoint', options, pipeline, ws, function(error, player) { + + if (error) return onError(error); + + player.on('EndOfStream', function(event){ + pipeline.release(); + // videoPlayer.src = ""; + + // hideSpinner(videoPlayer); + }); + + connectMediaElements(player, webRtcEndpoint,function(error) { + if (error) return onError(error); + + webRtcEndpoint.on('OnIceCandidate', function(event) { + var candidate = kurento.getComplexType('IceCandidate')(event.candidate); + ws.send(JSON.stringify({ + id : 'iceCandidate', + candidate : candidate + })); + }); + + webRtcEndpoint.processOffer(sdpOffer, function(error, sdpAnswer) { + if (error) { + pipeline.release(); + return callback(error); + } + + sessions[sessionId] = { + 'pipeline' : pipeline, + 'webRtcEndpoint' : webRtcEndpoint + } + return callback(null, sdpAnswer); + }); + + webRtcEndpoint.gatherCandidates(function(error) { + if (error) { + return callback(error); + } + }); + + player.play(function(error) { + if (error) return onError(error); + console.log("Playing ..."); + }); + }); + + }); + + }); + }); + }); +} function createMediaElements(elements, pipeline, ws, callback) { pipeline.create(elements, function(error, elements) { @@ -290,8 +369,8 @@ function createMediaElementsWithOption(elements, option, pipeline, ws, callback) }); } -function connectMediaElements(webRtcEndpoint, callback) { - webRtcEndpoint.connect(webRtcEndpoint, function(error) { +function connectMediaElements(target_1, target2, callback) { + target_1.connect(target2, function(error) { if (error) { return callback(error); } From 5951b392bcdabfe3a111a65ec2d49fbc9375e815 Mon Sep 17 00:00:00 2001 From: tony Date: Wed, 18 Oct 2017 15:56:01 +0900 Subject: [PATCH 10/12] play record stream but cannot replay yet --- kurento-recorder/server.js | 120 +++++++++++++++++++--------- kurento-recorder/static/js/index.js | 20 +++-- 2 files changed, 94 insertions(+), 46 deletions(-) diff --git a/kurento-recorder/server.js b/kurento-recorder/server.js index 95c1922f..13bf22ea 100755 --- a/kurento-recorder/server.js +++ b/kurento-recorder/server.js @@ -226,6 +226,7 @@ function start(sessionId, ws, sdpOffer, callback) { } webRtc.on('OnIceCandidate', function(event) { + console.log('OnIceCandidate called r'); var candidate = kurento.getComplexType('IceCandidate')(event.candidate); ws.send(JSON.stringify({ id : 'iceCandidate', @@ -281,70 +282,110 @@ function play(sessionId, ws, sdpOffer, callback) { return callback(error); } - createMediaElements('WebRtcEndpoint', pipeline, ws, function(error, webRtcEndpoint) { - if (error) { - pipeline.release(); - return callback(error); - } - - if (candidatesQueue[sessionId]) { - while(candidatesQueue[sessionId].length) { - var candidate = candidatesQueue[sessionId].shift(); - webRtcEndpoint.addIceCandidate(candidate); - } - } - var options = {uri : argv.file_uri} createMediaElementsWithOption('PlayerEndpoint', options, pipeline, ws, function(error, player) { if (error) return onError(error); + player.on('EndOfStream', function(event){ + console.log('END OF STREAM'); pipeline.release(); // videoPlayer.src = ""; // hideSpinner(videoPlayer); }); - connectMediaElements(player, webRtcEndpoint,function(error) { + + player.play(function(error) { if (error) return onError(error); + console.log("Playing ..."); - webRtcEndpoint.on('OnIceCandidate', function(event) { - var candidate = kurento.getComplexType('IceCandidate')(event.candidate); - ws.send(JSON.stringify({ - id : 'iceCandidate', - candidate : candidate - })); - }); - - webRtcEndpoint.processOffer(sdpOffer, function(error, sdpAnswer) { + createMediaElements('WebRtcEndpoint', pipeline, ws, function(error, webRtcEndpoint) { if (error) { pipeline.release(); return callback(error); } - sessions[sessionId] = { - 'pipeline' : pipeline, - 'webRtcEndpoint' : webRtcEndpoint + webRtcEndpoint.on('OnIceCandidate', function(event) { + var candidate = kurento.getComplexType('IceCandidate')(event.candidate); + console.log('OnIceCandidate called'); + ws.send(JSON.stringify({ + id : 'iceCandidate', + candidate : candidate + })); + }); + + + if (candidatesQueue[sessionId]) { + console.log('candidatesQueue'); + while(candidatesQueue[sessionId].length) { + var candidate = candidatesQueue[sessionId].shift(); + webRtcEndpoint.addIceCandidate(candidate); + } } - return callback(null, sdpAnswer); - }); - webRtcEndpoint.gatherCandidates(function(error) { - if (error) { - return callback(error); - } - }); - - player.play(function(error) { - if (error) return onError(error); - console.log("Playing ..."); + + + webRtcEndpoint.processOffer(sdpOffer, function(error, sdpAnswer) { + console.log('processOffer'); + if (error) { + pipeline.release(); + return callback(error); + } + + sessions[sessionId] = { + 'pipeline' : pipeline, + 'webRtcEndpoint' : webRtcEndpoint, + } + + connectMediaElements(player, webRtcEndpoint,function(error) { + if (error) return onError(error); + + console.log('connectMediaElements'); + return callback(null, sdpAnswer); + }); + + + }); + + webRtcEndpoint.gatherCandidates(function(error) { + if (error) { + return callback(error); + } + }); + + }); + + }); + + + + // connectMediaElements(player, webRtcEndpoint,function(error) { + // if (error) return onError(error); + + // webRtcEndpoint.on('OnIceCandidate', function(event) { + // var candidate = kurento.getComplexType('IceCandidate')(event.candidate); + // ws.send(JSON.stringify({ + // id : 'iceCandidate', + // candidate : candidate + // })); + // }); + + + + // webRtcEndpoint.gatherCandidates(function(error) { + // if (error) { + // return callback(error); + // } + // }); + + // }); }); - }); }); }); } @@ -398,7 +439,8 @@ function stop(sessionId) { delete sessions[sessionId]; delete candidatesQueue[sessionId]; - recorder.stop(); + if(recorder) + recorder.stop(); pipeline.release(); } diff --git a/kurento-recorder/static/js/index.js b/kurento-recorder/static/js/index.js index fa3f6fb7..04f586b9 100644 --- a/kurento-recorder/static/js/index.js +++ b/kurento-recorder/static/js/index.js @@ -19,6 +19,7 @@ var ws = new WebSocket('wss://' + location.host + '/helloworld'); var videoInput; var videoOutput; var webRtcPeer; +var webRtcPeerPlay; var state = null; const I_CAN_START = 0; @@ -57,7 +58,11 @@ ws.onmessage = function(message) { onError('Error message from server: ' + parsedMessage.message); break; case 'iceCandidate': - webRtcPeer.addIceCandidate(parsedMessage.candidate) + + if(webRtcPeer) + webRtcPeer.addIceCandidate(parsedMessage.candidate) + else + webRtcPeerPlay.addIceCandidate(parsedMessage.candidate) break; default: if (state == I_AM_STARTING) { @@ -122,7 +127,7 @@ function startResponse(message) { function playResponse(message) { setState(I_CAN_STOP_PLAYING); console.log('SDP answer received from server. Processing ...'); - webRtcPeer.processAnswer(message.sdpAnswer); + webRtcPeerPlay.processAnswer(message.sdpAnswer); } function stop() { @@ -163,10 +168,11 @@ function startPlaying() { showSpinner(videoOutput); var options = { - remoteVideo: videoOutput + remoteVideo: videoOutput, + onicecandidate : onIceCandidate } - webRtcPeer = kurentoUtils.WebRtcPeer.WebRtcPeerRecvonly(options, function(error) { + webRtcPeerPlay = kurentoUtils.WebRtcPeer.WebRtcPeerRecvonly(options, function(error) { if(error) return onError(error); this.generateOffer(onPlayOffer); }); @@ -202,8 +208,8 @@ function setState(nextState) { break; case I_CAN_STOP_PLAYING: - $('#start').attr('disabled', true); - $('#start').removeAttr('onclick'); + $('#start').attr('disabled', false); + $('#start').attr('onclick', 'start()'); $('#stop').attr('disabled', true); $('#stop').removeAttr('onclick'); $('#play').attr('disabled', false); @@ -219,7 +225,7 @@ function setState(nextState) { function sendMessage(message) { var jsonMessage = JSON.stringify(message); - console.log('Senging message: ' + jsonMessage); + console.log('Sending message: ' + jsonMessage); ws.send(jsonMessage); } From 133f4bc91adbb9eda410f01b29d9f967ac1fc0b0 Mon Sep 17 00:00:00 2001 From: tony Date: Wed, 18 Oct 2017 16:32:48 +0900 Subject: [PATCH 11/12] make code clean --- kurento-recorder/server.js | 148 ++++++++++++++----------------------- 1 file changed, 54 insertions(+), 94 deletions(-) diff --git a/kurento-recorder/server.js b/kurento-recorder/server.js index 13bf22ea..859e205e 100755 --- a/kurento-recorder/server.js +++ b/kurento-recorder/server.js @@ -202,7 +202,7 @@ function start(sessionId, ws, sdpOffer, callback) { {type: 'WebRtcEndpoint', params: {}} ]; - createMediaElements(elements, pipeline, ws, function(error, elements) { + createMediaElements(elements, pipeline, function(error, elements) { var recorder = elements[0]; var webRtc = elements[1]; @@ -226,7 +226,6 @@ function start(sessionId, ws, sdpOffer, callback) { } webRtc.on('OnIceCandidate', function(event) { - console.log('OnIceCandidate called r'); var candidate = kurento.getComplexType('IceCandidate')(event.candidate); ws.send(JSON.stringify({ id : 'iceCandidate', @@ -255,10 +254,8 @@ function start(sessionId, ws, sdpOffer, callback) { }); recorder.record(function(error) { - if (error) return onError(error); - - console.log("record"); - + if (error) return onError(error); + console.log("record"); }); }); @@ -282,115 +279,78 @@ function play(sessionId, ws, sdpOffer, callback) { return callback(error); } - var options = {uri : argv.file_uri} - createMediaElementsWithOption('PlayerEndpoint', options, pipeline, ws, function(error, player) { + var options = {uri : argv.file_uri} + createMediaElementsWithOption('PlayerEndpoint', options, pipeline, function(error, player) { + + if (error) return onError(error); + + + player.on('EndOfStream', function(event){ + console.log('END OF STREAM'); + pipeline.release(); + }); + + player.play(function(error) { if (error) return onError(error); + console.log("Playing ..."); + createMediaElements('WebRtcEndpoint', pipeline, function(error, webRtcEndpoint) { + if (error) { + pipeline.release(); + return callback(error); + } - player.on('EndOfStream', function(event){ - console.log('END OF STREAM'); - pipeline.release(); - // videoPlayer.src = ""; - - // hideSpinner(videoPlayer); - }); + webRtcEndpoint.on('OnIceCandidate', function(event) { + var candidate = kurento.getComplexType('IceCandidate')(event.candidate); + console.log('OnIceCandidate called'); + ws.send(JSON.stringify({ + id : 'iceCandidate', + candidate : candidate + })); + }); - - player.play(function(error) { - if (error) return onError(error); - console.log("Playing ..."); + if (candidatesQueue[sessionId]) { + console.log('candidatesQueue'); + while(candidatesQueue[sessionId].length) { + var candidate = candidatesQueue[sessionId].shift(); + webRtcEndpoint.addIceCandidate(candidate); + } + } - createMediaElements('WebRtcEndpoint', pipeline, ws, function(error, webRtcEndpoint) { + webRtcEndpoint.processOffer(sdpOffer, function(error, sdpAnswer) { + console.log('processOffer'); if (error) { pipeline.release(); return callback(error); } - webRtcEndpoint.on('OnIceCandidate', function(event) { - var candidate = kurento.getComplexType('IceCandidate')(event.candidate); - console.log('OnIceCandidate called'); - ws.send(JSON.stringify({ - id : 'iceCandidate', - candidate : candidate - })); - }); - - - if (candidatesQueue[sessionId]) { - console.log('candidatesQueue'); - while(candidatesQueue[sessionId].length) { - var candidate = candidatesQueue[sessionId].shift(); - webRtcEndpoint.addIceCandidate(candidate); - } + sessions[sessionId] = { + 'pipeline' : pipeline, + 'webRtcEndpoint' : webRtcEndpoint, } + connectMediaElements(player, webRtcEndpoint,function(error) { + if (error) return onError(error); - - webRtcEndpoint.processOffer(sdpOffer, function(error, sdpAnswer) { - console.log('processOffer'); - if (error) { - pipeline.release(); - return callback(error); - } - - sessions[sessionId] = { - 'pipeline' : pipeline, - 'webRtcEndpoint' : webRtcEndpoint, - } - - connectMediaElements(player, webRtcEndpoint,function(error) { - if (error) return onError(error); - - console.log('connectMediaElements'); - return callback(null, sdpAnswer); - }); - - - }); - - webRtcEndpoint.gatherCandidates(function(error) { - if (error) { - return callback(error); - } - }); - - + console.log('connectMediaElements'); + return callback(null, sdpAnswer); + }); }); - + webRtcEndpoint.gatherCandidates(function(error) { + if (error) { + return callback(error); + } + }); }); - - - - // connectMediaElements(player, webRtcEndpoint,function(error) { - // if (error) return onError(error); - - // webRtcEndpoint.on('OnIceCandidate', function(event) { - // var candidate = kurento.getComplexType('IceCandidate')(event.candidate); - // ws.send(JSON.stringify({ - // id : 'iceCandidate', - // candidate : candidate - // })); - // }); - - - - // webRtcEndpoint.gatherCandidates(function(error) { - // if (error) { - // return callback(error); - // } - // }); - - // }); - }); - + }); }); }); } -function createMediaElements(elements, pipeline, ws, callback) { +function createMediaElements(elements, pipeline, callback) { pipeline.create(elements, function(error, elements) { if (error) { return callback(error); @@ -400,7 +360,7 @@ function createMediaElements(elements, pipeline, ws, callback) { }); } -function createMediaElementsWithOption(elements, option, pipeline, ws, callback) { +function createMediaElementsWithOption(elements, option, pipeline, callback) { pipeline.create(elements, option,function(error, elements) { if (error) { return callback(error); From eec355f7708f794b52f704abd9f839fe852e41e9 Mon Sep 17 00:00:00 2001 From: tony Date: Wed, 18 Oct 2017 16:47:41 +0900 Subject: [PATCH 12/12] change recorder README --- kurento-recorder/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/kurento-recorder/README.md b/kurento-recorder/README.md index d99499ba..60751a8b 100644 --- a/kurento-recorder/README.md +++ b/kurento-recorder/README.md @@ -7,10 +7,10 @@ Copyright © 2013-2016 [Kurento]. Licensed under [Apache 2.0 License]. -kurento-hello-world -=================== +kurento-recorder +================ -Kurento Java Tutorial: Hello World (WebRTC in loopback). +Kurento JavaScript Tutorial: WebRTC in loopback with recorder. Running this tutorial --------------------- @@ -119,4 +119,4 @@ Before asking for support, please read first the [Kurento Netiquette Guidelines] [readthedocs.org]: http://kurento.readthedocs.org/ [Open API specification]: http://kurento.github.io/doc-kurento/ [apiary.io]: http://docs.streamoriented.apiary.io/ -[instructions]: http://www.kurento.org/docs/current/tutorials/node/tutorial-helloworld.html +[instructions]: http://www.kurento.org/docs/current/tutorials/js/tutorial-recorder.html