From 50abd7b87a759d30f088e18a30c03edc65cb41e6 Mon Sep 17 00:00:00 2001 From: Nicolas Pope <nwpope@utu.fi> Date: Thu, 28 May 2020 16:26:19 +0300 Subject: [PATCH] Recfactor MSE player --- web-service/public/js/bundle.js | 171 ++++++++++++++++++-------------- web-service/public/js/ftlmse.js | 85 ++++++++++++++++ web-service/public/js/index.js | 76 +------------- 3 files changed, 186 insertions(+), 146 deletions(-) create mode 100644 web-service/public/js/ftlmse.js diff --git a/web-service/public/js/bundle.js b/web-service/public/js/bundle.js index 5e809d927..05c1d80c7 100644 --- a/web-service/public/js/bundle.js +++ b/web-service/public/js/bundle.js @@ -70821,6 +70821,93 @@ module.exports = v4; },{"./lib/bytesToUuid":104,"./lib/rng":105}],108:[function(require,module,exports){ var ee = require('event-emitter'); +const FTLRemux = require('./ftlremux'); + +function FTLMSE(video) { + this.video = video; + this.remux = new FTLRemux(); + + this.paused = false; + this.active = false; + + this.remux.on('data', (data) => { + if (this.sourceBuffer.updating) { + this.queue.push(data); + } else { + //console.log("Direct append: ", data); + + try { + this.sourceBuffer.appendBuffer(data); + } catch (e) { + console.error("Failed to append buffer"); + } + } + }); + + // TODO: Generate + this.mime = 'video/mp4; codecs="avc1.640028"'; + + this.mediaSource = new MediaSource(); + //this.element.play(); + this.sourceBuffer = null; + + this.video.addEventListener('pause', (e) => { + console.log("pause"); + this.active = false; + }); + + this.video.addEventListener('play', (e) => { + console.log("Play"); + this.active = true; + this.remux.select(0,0,0); + }); + + this.mediaSource.addEventListener('sourceopen', (e) => { + console.log("Source Open"); + URL.revokeObjectURL(this.video.src); + console.log(this.mediaSource.readyState); + this.sourceBuffer = e.target.addSourceBuffer(this.mime); + this.sourceBuffer.mode = 'sequence'; + this.active = true; + + this.sourceBuffer.addEventListener('error', (e) => { + console.error("SourceBuffer: ", e); + this.active = false; + }); + + this.sourceBuffer.addEventListener('updateend', () => { + if (this.queue.length > 0 && !this.sourceBuffer.updating) { + let s = this.queue[0]; + this.queue.shift(); + //console.log("Append", s); + + try { + this.sourceBuffer.appendBuffer(s); + } catch(e) { + console.error("Failed to append buffer"); + } + } + }); + }); + + this.queue = []; + this.video.src = URL.createObjectURL(this.mediaSource); +} + +ee(FTLMSE.prototype); + +FTLMSE.prototype.push = function(spkt, pkt) { + this.remux.push(spkt,pkt); +} + +FTLMSE.prototype.select = function(frameset, source, channel) { + this.remux.select(frameset, source, channel); +} + +module.exports = FTLMSE; + +},{"./ftlremux":109,"event-emitter":26}],109:[function(require,module,exports){ +var ee = require('event-emitter'); const MUXJS = require('mux.js'); const MP4 = MUXJS.mp4.generator; const H264Stream = MUXJS.codecs.h264.H264Stream; @@ -71020,13 +71107,13 @@ FTLRemux.prototype.reset = function() { module.exports = FTLRemux; -},{"event-emitter":26,"mux.js":50}],109:[function(require,module,exports){ +},{"event-emitter":26,"mux.js":50}],110:[function(require,module,exports){ (function (Buffer){ const Peer = require('../../server/src/peer') const msgpack = require('msgpack5')(); const rematrix = require('rematrix'); const THREE = require('three'); -const FTLRemux = require('./ftlremux'); +const FTLMSE = require('./ftlmse'); //const VIDEO_PROPERTIES = require('../../node_modules/mux.js/lib/constants/video-properties.js'); @@ -71313,7 +71400,7 @@ function FTLStream(peer, uri, element) { this.overlay.appendChild(this.pause_button); this.paused = false; - this.active = false; + this.active = true; this.overlay.addEventListener('keydown', (event) => { console.log(event); @@ -71361,73 +71448,7 @@ function FTLStream(peer, uri, element) { let rxcount = 0; - this.remux = new FTLRemux(); - this.remux.on('data', (data) => { - this.doAppend(data); - }); - - this.doAppend = function(data) { - if (this.sourceBuffer.updating) { - this.queue.push(data); - } else { - //console.log("Direct append: ", data); - - try { - this.sourceBuffer.appendBuffer(data); - } catch (e) { - console.error("Failed to append buffer"); - } - } - } - - this.mime = 'video/mp4; codecs="avc1.640028"'; - - this.mediaSource = new MediaSource(); - //this.element.play(); - this.sourceBuffer = null; - - this.element.addEventListener('pause', (e) => { - console.log("pause"); - this.active = false; - }); - - this.element.addEventListener('play', (e) => { - console.log("Play"); - this.active = true; - this.remux.select(0,0,0); - }); - - this.mediaSource.addEventListener('sourceopen', (e) => { - console.log("Source Open"); - URL.revokeObjectURL(this.element.src); - console.log(this.mediaSource.readyState); - this.sourceBuffer = e.target.addSourceBuffer(this.mime); - this.sourceBuffer.mode = 'sequence'; - this.active = true; - - this.sourceBuffer.addEventListener('error', (e) => { - console.error("SourceBuffer: ", e); - this.active = false; - }); - - this.sourceBuffer.addEventListener('updateend', () => { - if (this.queue.length > 0 && !this.sourceBuffer.updating) { - let s = this.queue[0]; - this.queue.shift(); - //console.log("Append", s); - - try { - this.sourceBuffer.appendBuffer(s); - } catch(e) { - console.error("Failed to append buffer"); - } - } - }); - }); - - this.queue = []; - - this.element.src = URL.createObjectURL(this.mediaSource); + this.mse = new FTLMSE(this.element); this.peer.bind(uri, (latency, streampckg, pckg) => { if (this.paused || !this.active) { @@ -71445,7 +71466,7 @@ function FTLStream(peer, uri, element) { //peer.send(current_data.uri, 0, [255,7,35,0,0,Buffer.alloc(0)], [1,0,255,0]); } - this.remux.push(streampckg, pckg); + this.mse.push(streampckg, pckg); } } else if (pckg[0] === 103) { //console.log(msgpack.decode(pckg[5])); @@ -71515,7 +71536,7 @@ FTLStream.prototype.start = function(fs, source, channel) { this.current_source = source; this.current_channel = channel; - this.remux.select(fs, source, channel); + this.mse.select(fs, source, channel); if (this.found) { this.peer.send(this.uri, 0, [1,fs,255,channel],[255,7,35,0,0,Buffer.alloc(0)]); @@ -71631,7 +71652,7 @@ saveConfigs = async () => { const content = await rawResp.json(); } }).call(this,require("buffer").Buffer) -},{"../../server/src/peer":110,"./ftlremux":108,"buffer":9,"msgpack5":32,"rematrix":89,"three":92}],110:[function(require,module,exports){ +},{"../../server/src/peer":111,"./ftlmse":108,"buffer":9,"msgpack5":32,"rematrix":89,"three":92}],111:[function(require,module,exports){ (function (Buffer){ const msgpack = require('msgpack5')() , encode = msgpack.encode @@ -71920,7 +71941,7 @@ Peer.prototype.getUuid = function() { module.exports = Peer; }).call(this,require("buffer").Buffer) -},{"./utils/uuidParser":111,"buffer":9,"msgpack5":32,"uuid":103}],111:[function(require,module,exports){ +},{"./utils/uuidParser":112,"buffer":9,"msgpack5":32,"uuid":103}],112:[function(require,module,exports){ // Maps for number <-> hex string conversion var _byteToHex = []; var _hexToByte = {}; @@ -71975,4 +71996,4 @@ module.exports = { parse: parse, unparse: unparse }; -},{}]},{},[109]); +},{}]},{},[110]); diff --git a/web-service/public/js/ftlmse.js b/web-service/public/js/ftlmse.js new file mode 100644 index 000000000..75309c12d --- /dev/null +++ b/web-service/public/js/ftlmse.js @@ -0,0 +1,85 @@ +var ee = require('event-emitter'); +const FTLRemux = require('./ftlremux'); + +function FTLMSE(video) { + this.video = video; + this.remux = new FTLRemux(); + + this.paused = false; + this.active = false; + + this.remux.on('data', (data) => { + if (this.sourceBuffer.updating) { + this.queue.push(data); + } else { + //console.log("Direct append: ", data); + + try { + this.sourceBuffer.appendBuffer(data); + } catch (e) { + console.error("Failed to append buffer"); + } + } + }); + + // TODO: Generate + this.mime = 'video/mp4; codecs="avc1.640028"'; + + this.mediaSource = new MediaSource(); + //this.element.play(); + this.sourceBuffer = null; + + this.video.addEventListener('pause', (e) => { + console.log("pause"); + this.active = false; + }); + + this.video.addEventListener('play', (e) => { + console.log("Play"); + this.active = true; + this.remux.select(0,0,0); + }); + + this.mediaSource.addEventListener('sourceopen', (e) => { + console.log("Source Open"); + URL.revokeObjectURL(this.video.src); + console.log(this.mediaSource.readyState); + this.sourceBuffer = e.target.addSourceBuffer(this.mime); + this.sourceBuffer.mode = 'sequence'; + this.active = true; + + this.sourceBuffer.addEventListener('error', (e) => { + console.error("SourceBuffer: ", e); + this.active = false; + }); + + this.sourceBuffer.addEventListener('updateend', () => { + if (this.queue.length > 0 && !this.sourceBuffer.updating) { + let s = this.queue[0]; + this.queue.shift(); + //console.log("Append", s); + + try { + this.sourceBuffer.appendBuffer(s); + } catch(e) { + console.error("Failed to append buffer"); + } + } + }); + }); + + this.queue = []; + this.video.src = URL.createObjectURL(this.mediaSource); +} + +ee(FTLMSE.prototype); + +FTLMSE.prototype.push = function(spkt, pkt) { + this.remux.push(spkt,pkt); +} + +FTLMSE.prototype.select = function(frameset, source, channel) { + this.remux.select(frameset, source, channel); +} + +module.exports = FTLMSE; diff --git a/web-service/public/js/index.js b/web-service/public/js/index.js index a3a9dd464..4f3fd8149 100644 --- a/web-service/public/js/index.js +++ b/web-service/public/js/index.js @@ -2,7 +2,7 @@ const Peer = require('../../server/src/peer') const msgpack = require('msgpack5')(); const rematrix = require('rematrix'); const THREE = require('three'); -const FTLRemux = require('./ftlremux'); +const FTLMSE = require('./ftlmse'); //const VIDEO_PROPERTIES = require('../../node_modules/mux.js/lib/constants/video-properties.js'); @@ -289,7 +289,7 @@ function FTLStream(peer, uri, element) { this.overlay.appendChild(this.pause_button); this.paused = false; - this.active = false; + this.active = true; this.overlay.addEventListener('keydown', (event) => { console.log(event); @@ -337,73 +337,7 @@ function FTLStream(peer, uri, element) { let rxcount = 0; - this.remux = new FTLRemux(); - this.remux.on('data', (data) => { - this.doAppend(data); - }); - - this.doAppend = function(data) { - if (this.sourceBuffer.updating) { - this.queue.push(data); - } else { - //console.log("Direct append: ", data); - - try { - this.sourceBuffer.appendBuffer(data); - } catch (e) { - console.error("Failed to append buffer"); - } - } - } - - this.mime = 'video/mp4; codecs="avc1.640028"'; - - this.mediaSource = new MediaSource(); - //this.element.play(); - this.sourceBuffer = null; - - this.element.addEventListener('pause', (e) => { - console.log("pause"); - this.active = false; - }); - - this.element.addEventListener('play', (e) => { - console.log("Play"); - this.active = true; - this.remux.select(0,0,0); - }); - - this.mediaSource.addEventListener('sourceopen', (e) => { - console.log("Source Open"); - URL.revokeObjectURL(this.element.src); - console.log(this.mediaSource.readyState); - this.sourceBuffer = e.target.addSourceBuffer(this.mime); - this.sourceBuffer.mode = 'sequence'; - this.active = true; - - this.sourceBuffer.addEventListener('error', (e) => { - console.error("SourceBuffer: ", e); - this.active = false; - }); - - this.sourceBuffer.addEventListener('updateend', () => { - if (this.queue.length > 0 && !this.sourceBuffer.updating) { - let s = this.queue[0]; - this.queue.shift(); - //console.log("Append", s); - - try { - this.sourceBuffer.appendBuffer(s); - } catch(e) { - console.error("Failed to append buffer"); - } - } - }); - }); - - this.queue = []; - - this.element.src = URL.createObjectURL(this.mediaSource); + this.mse = new FTLMSE(this.element); this.peer.bind(uri, (latency, streampckg, pckg) => { if (this.paused || !this.active) { @@ -421,7 +355,7 @@ function FTLStream(peer, uri, element) { //peer.send(current_data.uri, 0, [255,7,35,0,0,Buffer.alloc(0)], [1,0,255,0]); } - this.remux.push(streampckg, pckg); + this.mse.push(streampckg, pckg); } } else if (pckg[0] === 103) { //console.log(msgpack.decode(pckg[5])); @@ -491,7 +425,7 @@ FTLStream.prototype.start = function(fs, source, channel) { this.current_source = source; this.current_channel = channel; - this.remux.select(fs, source, channel); + this.mse.select(fs, source, channel); if (this.found) { this.peer.send(this.uri, 0, [1,fs,255,channel],[255,7,35,0,0,Buffer.alloc(0)]); -- GitLab