diff --git a/plugins/objectdetector/package-lock.json b/plugins/objectdetector/package-lock.json index 8f70b0eea..5d52cddda 100644 --- a/plugins/objectdetector/package-lock.json +++ b/plugins/objectdetector/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/objectdetector", - "version": "0.0.114", + "version": "0.0.116", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@scrypted/objectdetector", - "version": "0.0.114", + "version": "0.0.116", "license": "Apache-2.0", "dependencies": { "@scrypted/common": "file:../../common", diff --git a/plugins/objectdetector/package.json b/plugins/objectdetector/package.json index 01240a048..d1ebb7d39 100644 --- a/plugins/objectdetector/package.json +++ b/plugins/objectdetector/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/objectdetector", - "version": "0.0.114", + "version": "0.0.116", "description": "Scrypted Video Analysis Plugin. Installed alongside a detection service like OpenCV or TensorFlow.", "author": "Scrypted", "license": "Apache-2.0", diff --git a/plugins/objectdetector/src/ffmpeg-videoframes.ts b/plugins/objectdetector/src/ffmpeg-videoframes.ts index 98a29a31e..8ae8def42 100644 --- a/plugins/objectdetector/src/ffmpeg-videoframes.ts +++ b/plugins/objectdetector/src/ffmpeg-videoframes.ts @@ -1,6 +1,7 @@ import { Deferred } from "@scrypted/common/src/deferred"; -import { ffmpegLogInitialOutput, safeKillFFmpeg } from "@scrypted/common/src/media-helpers"; +import { ffmpegLogInitialOutput, safeKillFFmpeg, safePrintFFmpegArguments } from "@scrypted/common/src/media-helpers"; import { readLength, readLine } from "@scrypted/common/src/read-stream"; +import { addVideoFilterArguments } from "@scrypted/common/src/ffmpeg-helpers"; import sdk, { FFmpegInput, Image, ImageOptions, MediaObject, ScryptedDeviceBase, ScryptedMimeTypes, VideoFrame, VideoFrameGenerator, VideoFrameGeneratorOptions } from "@scrypted/sdk"; import child_process from 'child_process'; import sharp from 'sharp'; @@ -99,10 +100,15 @@ export class FFmpegVideoFrameGenerator extends ScryptedDeviceBase implements Vid 'pipe:3', ]; + // this seems to reduce latency. + addVideoFilterArguments(args, 'fps=10', 'fps'); + const cp = child_process.spawn(await sdk.mediaManager.getFFmpegPath(), args, { stdio: ['pipe', 'pipe', 'pipe', 'pipe'], }); - ffmpegLogInitialOutput(this.console, cp); + const console = mediaObject?.sourceId ? sdk.deviceManager.getMixinConsole(mediaObject.sourceId) : this.console; + safePrintFFmpegArguments(console, args); + ffmpegLogInitialOutput(console, cp); let finished = false; let frameDeferred: Deferred; @@ -143,14 +149,14 @@ export class FFmpegVideoFrameGenerator extends ScryptedDeviceBase implements Vid }); } else { - // this.console.warn('skipped frame'); + this.console.warn('skipped frame'); } } } catch (e) { } finally { - this.console.log('finished reader'); + console.log('finished reader'); finished = true; frameDeferred?.reject(new Error('frame generator finished')); } @@ -171,16 +177,20 @@ export class FFmpegVideoFrameGenerator extends ScryptedDeviceBase implements Vid } }); const vipsImage = new VipsImage(image, width, height); - const mo = await createVipsMediaObject(vipsImage); - yield mo; - vipsImage.image.destroy(); - vipsImage.image = undefined; + try { + const mo = await createVipsMediaObject(vipsImage); + yield mo; + } + finally { + vipsImage.image = undefined; + image.destroy(); + } } } catch (e) { } finally { - this.console.log('finished generator'); + console.log('finished generator'); finished = true; safeKillFFmpeg(cp); } diff --git a/plugins/objectdetector/src/main.ts b/plugins/objectdetector/src/main.ts index 0a7f7a48a..d8ec3537e 100644 --- a/plugins/objectdetector/src/main.ts +++ b/plugins/objectdetector/src/main.ts @@ -980,7 +980,7 @@ class ObjectDetectionMixin extends SettingsMixinDeviceBase