diff --git a/plugins/core/package-lock.json b/plugins/core/package-lock.json index 2faf9d18c..5b167e7ee 100644 --- a/plugins/core/package-lock.json +++ b/plugins/core/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/core", - "version": "0.0.244", + "version": "0.0.245", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@scrypted/core", - "version": "0.0.244", + "version": "0.0.245", "license": "Apache-2.0", "dependencies": { "@scrypted/common": "file:../../common", @@ -87,7 +87,7 @@ }, "../../sdk": { "name": "@scrypted/sdk", - "version": "0.0.195", + "version": "0.0.196", "license": "ISC", "dependencies": { "@babel/preset-typescript": "^7.16.7", diff --git a/plugins/core/package.json b/plugins/core/package.json index d9a109c57..42201be99 100644 --- a/plugins/core/package.json +++ b/plugins/core/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/core", - "version": "0.0.244", + "version": "0.0.245", "description": "Scrypted Core plugin. Provides the UI, websocket, and engine.io APIs.", "author": "Scrypted", "license": "Apache-2.0", diff --git a/plugins/core/src/aggregate.ts b/plugins/core/src/aggregate.ts index 6c1b42586..4b930c71b 100644 --- a/plugins/core/src/aggregate.ts +++ b/plugins/core/src/aggregate.ts @@ -116,9 +116,16 @@ function createVideoCamera(devices: VideoCamera[], console: Console): VideoCamer filter.join(' '), ); - const parsers ={ + const parsers = { mpegts: createMpegTsParser({ - vcodec: ['-vcodec', 'libx264'], + vcodec: [ + "-b:v", '2000k', + "-c:v", "libx264", + '-preset', 'ultrafast', + "-bf", "0", + '-r', '15', + '-force_key_frames', 'expr:gte(t,n_forced*4)', + ], }) }; const ret = await startParserSession(filteredInput, { @@ -126,8 +133,8 @@ function createVideoCamera(devices: VideoCamera[], console: Console): VideoCamer parsers, timeout: 30000, }); - - let rebroadcaster = await createParserRebroadcaster(ret, 'mpegts',{ + + let rebroadcaster = await createParserRebroadcaster(ret, 'mpegts', { idle: { timeout: 30000, callback: () => ret.kill(), @@ -141,16 +148,20 @@ function createVideoCamera(devices: VideoCamera[], console: Console): VideoCamer }; }; + const createVideoStreamOptions = () => { + if (devices.length === 1) + return devices[0].getVideoStreamOptions(); + return [{ + id: 'default', + name: 'Default', + video: {}, + audio: null, + }] + } + return { async getVideoStreamOptions() { - if (devices.length === 1) - return devices[0].getVideoStreamOptions(); - return [{ - id: 'default', - name: 'Default', - video: {}, - audio: null, - }] + return createVideoStreamOptions(); }, async getVideoStream(options) { @@ -160,21 +171,22 @@ function createVideoCamera(devices: VideoCamera[], console: Console): VideoCamer if (!sessionPromise) { sessionPromise = getVideoStreamWrapped(options); const ret = await sessionPromise; - ret.session.on('killed', () => sessionPromise = undefined); + ret.session.killed.finally(() => sessionPromise = undefined); } const ret = await sessionPromise; - const {url} = ret.rebroadcaster; + const { url } = ret.rebroadcaster; const ffmpegInput: FFmpegInput = { url, + mediaStreamOptions: createVideoStreamOptions()[0], container: 'mpegts', inputArguments: [ - ...(ret.parsers.mpegts.inputArguments || []), - '-f', ret.parsers.mpegts.container, - '-i', url, + ...(ret.parsers.mpegts.inputArguments || []), + '-f', ret.parsers.mpegts.container, + '-i', url, ], - } - + } + return mediaManager.createFFmpegMediaObject(ffmpegInput); } } diff --git a/plugins/core/ui/package-lock.json b/plugins/core/ui/package-lock.json index 3a5b88907..158c16a21 100644 --- a/plugins/core/ui/package-lock.json +++ b/plugins/core/ui/package-lock.json @@ -132,7 +132,7 @@ }, "../../../sdk": { "name": "@scrypted/sdk", - "version": "0.0.195", + "version": "0.0.196", "license": "ISC", "dependencies": { "@babel/preset-typescript": "^7.16.7", @@ -167,7 +167,7 @@ }, "../../../sdk/types": { "name": "@scrypted/types", - "version": "0.0.39", + "version": "0.0.42", "license": "ISC", "devDependencies": {} },