@livekit/track-processors 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ProcessorPipeline.d.ts +8 -7
- package/dist/ProcessorPipeline.js +6 -4
- package/dist/ProcessorPipeline.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/package.json +56 -0
- package/dist/src/ProcessorPipeline.d.ts +19 -0
- package/dist/src/ProcessorPipeline.js +41 -0
- package/dist/src/ProcessorPipeline.js.map +1 -0
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.js +28 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/transformers/BackgroundTransformer.d.ts +23 -0
- package/dist/src/transformers/BackgroundTransformer.js +142 -0
- package/dist/src/transformers/BackgroundTransformer.js.map +1 -0
- package/dist/src/transformers/DummyTransformer.d.ts +6 -0
- package/dist/src/transformers/DummyTransformer.js +10 -0
- package/dist/src/transformers/DummyTransformer.js.map +1 -0
- package/dist/src/transformers/MediaPipeHolisticTrackerTransformer.d.ts +18 -0
- package/dist/src/transformers/MediaPipeHolisticTrackerTransformer.js +44 -0
- package/dist/src/transformers/MediaPipeHolisticTrackerTransformer.js.map +1 -0
- package/dist/src/transformers/VideoTransformer.d.ts +12 -0
- package/dist/src/transformers/VideoTransformer.js +26 -0
- package/dist/src/transformers/VideoTransformer.js.map +1 -0
- package/dist/src/transformers/index.d.ts +2 -0
- package/dist/src/transformers/index.js +3 -0
- package/dist/src/transformers/index.js.map +1 -0
- package/dist/src/transformers/types.d.ts +14 -0
- package/dist/src/transformers/types.js +2 -0
- package/dist/src/transformers/types.js.map +1 -0
- package/dist/src/utils.d.ts +2 -0
- package/dist/src/utils.js +3 -0
- package/dist/src/utils.js.map +1 -0
- package/dist/transformers/BackgroundTransformer.d.ts +3 -3
- package/dist/transformers/BackgroundTransformer.js +26 -22
- package/dist/transformers/BackgroundTransformer.js.map +1 -1
- package/dist/transformers/MediaPipeHolisticTrackerTransformer.d.ts +2 -2
- package/dist/transformers/MediaPipeHolisticTrackerTransformer.js +2 -2
- package/dist/transformers/MediaPipeHolisticTrackerTransformer.js.map +1 -1
- package/dist/transformers/VideoTransformer.d.ts +3 -3
- package/dist/transformers/VideoTransformer.js +4 -1
- package/dist/transformers/VideoTransformer.js.map +1 -1
- package/dist/transformers/types.d.ts +8 -5
- package/package.json +3 -3
- package/src/transformers/BackgroundTransformer.ts +2 -3
- package/dist/BackgroundProcessor.d.ts +0 -23
- package/dist/BackgroundProcessor.js +0 -114
- package/dist/BackgroundProcessor.js.map +0 -1
- package/dist/BaseVideoProcessor.d.ts +0 -28
- package/dist/BaseVideoProcessor.js +0 -110
- package/dist/BaseVideoProcessor.js.map +0 -1
- package/dist/transformers/Untitled-1.d.ts +0 -1
- package/dist/transformers/Untitled-1.js +0 -219
- package/dist/transformers/Untitled-1.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/transformers/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG,OAAO,yBAAyB,KAAK,WAAW,CAAC;AAClF,MAAM,CAAC,MAAM,uBAAuB,GAAG,OAAO,eAAe,KAAK,WAAW,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/// <reference types="dom-webcodecs" />
|
|
2
2
|
import * as vision from '@mediapipe/tasks-vision';
|
|
3
3
|
import VideoTransformer from './VideoTransformer';
|
|
4
|
-
import {
|
|
4
|
+
import { VideoTransformerInitOptions } from './types';
|
|
5
5
|
export type BackgroundOptions = {
|
|
6
6
|
blurRadius?: number;
|
|
7
7
|
imagePath?: string;
|
|
@@ -13,11 +13,11 @@ export default class BackgroundProcessor extends VideoTransformer {
|
|
|
13
13
|
backgroundImage: ImageBitmap | null;
|
|
14
14
|
blurRadius?: number;
|
|
15
15
|
constructor(opts: BackgroundOptions);
|
|
16
|
-
init({ outputCanvas, inputVideo }:
|
|
16
|
+
init({ outputCanvas, inputElement: inputVideo }: VideoTransformerInitOptions): Promise<void>;
|
|
17
17
|
destroy(): Promise<void>;
|
|
18
18
|
sendFramesContinuouslyForSegmentation(videoEl: HTMLVideoElement): Promise<void>;
|
|
19
19
|
loadBackground(path: string): Promise<void>;
|
|
20
20
|
transform(frame: VideoFrame, controller: TransformStreamDefaultController<VideoFrame>): Promise<void>;
|
|
21
|
-
drawVirtualBackground(frame: VideoFrame): void
|
|
21
|
+
drawVirtualBackground(frame: VideoFrame): Promise<void>;
|
|
22
22
|
blurBackground(frame: VideoFrame): Promise<void>;
|
|
23
23
|
}
|
|
@@ -6,7 +6,6 @@ export default class BackgroundProcessor extends VideoTransformer {
|
|
|
6
6
|
}
|
|
7
7
|
constructor(opts) {
|
|
8
8
|
super();
|
|
9
|
-
// backgroundImagePattern: CanvasPattern | null = null;
|
|
10
9
|
this.backgroundImage = null;
|
|
11
10
|
if (opts.blurRadius) {
|
|
12
11
|
this.blurRadius = opts.blurRadius;
|
|
@@ -15,8 +14,8 @@ export default class BackgroundProcessor extends VideoTransformer {
|
|
|
15
14
|
this.loadBackground(opts.imagePath);
|
|
16
15
|
}
|
|
17
16
|
}
|
|
18
|
-
async init({ outputCanvas, inputVideo }) {
|
|
19
|
-
super.init({ outputCanvas, inputVideo });
|
|
17
|
+
async init({ outputCanvas, inputElement: inputVideo }) {
|
|
18
|
+
super.init({ outputCanvas, inputElement: inputVideo });
|
|
20
19
|
const fileSet = await vision.FilesetResolver.forVisionTasks('https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@0.10.0/wasm');
|
|
21
20
|
this.imageSegmenter = await vision.ImageSegmenter.createFromOptions(fileSet, {
|
|
22
21
|
baseOptions: {
|
|
@@ -71,7 +70,7 @@ export default class BackgroundProcessor extends VideoTransformer {
|
|
|
71
70
|
await this.blurBackground(frame);
|
|
72
71
|
}
|
|
73
72
|
else {
|
|
74
|
-
this.drawVirtualBackground(frame);
|
|
73
|
+
await this.drawVirtualBackground(frame);
|
|
75
74
|
}
|
|
76
75
|
const newFrame = new VideoFrame(this.canvas, {
|
|
77
76
|
timestamp: frame.timestamp || Date.now(),
|
|
@@ -79,17 +78,17 @@ export default class BackgroundProcessor extends VideoTransformer {
|
|
|
79
78
|
frame.close();
|
|
80
79
|
controller.enqueue(newFrame);
|
|
81
80
|
}
|
|
82
|
-
drawVirtualBackground(frame) {
|
|
83
|
-
var _a
|
|
84
|
-
if (!this.canvas || !this.ctx)
|
|
81
|
+
async drawVirtualBackground(frame) {
|
|
82
|
+
var _a;
|
|
83
|
+
if (!this.canvas || !this.ctx || !this.segmentationResults || !this.inputVideo)
|
|
85
84
|
return;
|
|
86
85
|
// this.ctx.save();
|
|
87
86
|
// this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
|
|
88
87
|
if ((_a = this.segmentationResults) === null || _a === void 0 ? void 0 : _a.categoryMask) {
|
|
89
88
|
this.ctx.filter = 'blur(3px)';
|
|
90
89
|
this.ctx.globalCompositeOperation = 'copy';
|
|
91
|
-
const
|
|
92
|
-
this.ctx.
|
|
90
|
+
const bitmap = await maskToBitmap(this.segmentationResults.categoryMask, this.inputVideo.videoWidth, this.inputVideo.videoHeight);
|
|
91
|
+
this.ctx.drawImage(bitmap, 0, 0);
|
|
93
92
|
this.ctx.filter = 'none';
|
|
94
93
|
this.ctx.globalCompositeOperation = 'source-in';
|
|
95
94
|
if (this.backgroundImage) {
|
|
@@ -110,23 +109,16 @@ export default class BackgroundProcessor extends VideoTransformer {
|
|
|
110
109
|
if (!this.ctx ||
|
|
111
110
|
!this.canvas ||
|
|
112
111
|
!((_b = (_a = this.segmentationResults) === null || _a === void 0 ? void 0 : _a.categoryMask) === null || _b === void 0 ? void 0 : _b.canvas) ||
|
|
113
|
-
!this.inputVideo)
|
|
112
|
+
!this.inputVideo) {
|
|
114
113
|
return;
|
|
114
|
+
}
|
|
115
115
|
this.ctx.save();
|
|
116
116
|
this.ctx.globalCompositeOperation = 'copy';
|
|
117
|
-
const
|
|
118
|
-
|
|
119
|
-
for (let i = 0; i < result.length; i += 1) {
|
|
120
|
-
dataArray[i * 4] = result[i];
|
|
121
|
-
dataArray[i * 4 + 1] = result[i];
|
|
122
|
-
dataArray[i * 4 + 2] = result[i];
|
|
123
|
-
dataArray[i * 4 + 3] = result[i];
|
|
124
|
-
}
|
|
125
|
-
const dataNew = new ImageData(dataArray, this.inputVideo.videoWidth, this.inputVideo.videoHeight);
|
|
126
|
-
// this.ctx.filter = 'blur(3px)';
|
|
117
|
+
const bitmap = await maskToBitmap(this.segmentationResults.categoryMask, this.inputVideo.videoWidth, this.inputVideo.videoHeight);
|
|
118
|
+
this.ctx.filter = 'blur(3px)';
|
|
127
119
|
this.ctx.globalCompositeOperation = 'copy';
|
|
128
|
-
this.ctx.drawImage(
|
|
129
|
-
|
|
120
|
+
this.ctx.drawImage(bitmap, 0, 0);
|
|
121
|
+
this.ctx.filter = 'none';
|
|
130
122
|
this.ctx.globalCompositeOperation = 'source-out';
|
|
131
123
|
this.ctx.drawImage(frame, 0, 0, this.canvas.width, this.canvas.height);
|
|
132
124
|
this.ctx.globalCompositeOperation = 'destination-over';
|
|
@@ -136,4 +128,16 @@ export default class BackgroundProcessor extends VideoTransformer {
|
|
|
136
128
|
console.log('draw time', performance.now() - start);
|
|
137
129
|
}
|
|
138
130
|
}
|
|
131
|
+
function maskToBitmap(mask, videoWidth, videoHeight) {
|
|
132
|
+
const dataArray = new Uint8ClampedArray(videoWidth * videoHeight * 4);
|
|
133
|
+
const result = mask.getAsUint8Array();
|
|
134
|
+
for (let i = 0; i < result.length; i += 1) {
|
|
135
|
+
dataArray[i * 4] = result[i];
|
|
136
|
+
dataArray[i * 4 + 1] = result[i];
|
|
137
|
+
dataArray[i * 4 + 2] = result[i];
|
|
138
|
+
dataArray[i * 4 + 3] = result[i];
|
|
139
|
+
}
|
|
140
|
+
const dataNew = new ImageData(dataArray, videoWidth, videoHeight);
|
|
141
|
+
return createImageBitmap(dataNew);
|
|
142
|
+
}
|
|
139
143
|
//# sourceMappingURL=BackgroundTransformer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackgroundTransformer.js","sourceRoot":"","sources":["../../src/transformers/BackgroundTransformer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,yBAAyB,CAAC;AAClD,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAQlD,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,gBAAgB;IAC/D,MAAM,KAAK,WAAW;QACpB,OAAO,OAAO,eAAe,KAAK,WAAW,CAAC;IAChD,CAAC;
|
|
1
|
+
{"version":3,"file":"BackgroundTransformer.js","sourceRoot":"","sources":["../../src/transformers/BackgroundTransformer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Holistic, Options, Results } from '@mediapipe/holistic';
|
|
2
2
|
import VideoTransformer from './VideoTransformer';
|
|
3
|
-
import {
|
|
3
|
+
import { VideoTransformerInitOptions } from './types';
|
|
4
4
|
export type MediaPipeHolisticTrackerTransformerOptions = {
|
|
5
5
|
holisticOptions?: Options;
|
|
6
6
|
callback?: (results: Results) => void;
|
|
@@ -11,7 +11,7 @@ export default class MediaPipeHolisticTrackerTransformer extends VideoTransforme
|
|
|
11
11
|
callback: (results: Results) => void;
|
|
12
12
|
static get isSupported(): boolean;
|
|
13
13
|
constructor({ holisticOptions, callback }: MediaPipeHolisticTrackerTransformerOptions);
|
|
14
|
-
init({ inputVideo, outputCanvas }:
|
|
14
|
+
init({ inputElement: inputVideo, outputCanvas }: VideoTransformerInitOptions): void;
|
|
15
15
|
destroy(): Promise<void>;
|
|
16
16
|
transform(): Promise<void>;
|
|
17
17
|
sendFramesContinuouslyForTracking(videoEl: HTMLVideoElement): Promise<void>;
|
|
@@ -9,8 +9,8 @@ export default class MediaPipeHolisticTrackerTransformer extends VideoTransforme
|
|
|
9
9
|
this.callback = callback || (() => null);
|
|
10
10
|
this.holisticOptions = holisticOptions || {};
|
|
11
11
|
}
|
|
12
|
-
init({ inputVideo, outputCanvas }) {
|
|
13
|
-
super.init({ outputCanvas, inputVideo });
|
|
12
|
+
init({ inputElement: inputVideo, outputCanvas }) {
|
|
13
|
+
super.init({ outputCanvas, inputElement: inputVideo });
|
|
14
14
|
this.holistic = new Holistic({
|
|
15
15
|
locateFile: (file) => `https://cdn.jsdelivr.net/npm/@mediapipe/holistic/${file}`,
|
|
16
16
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MediaPipeHolisticTrackerTransformer.js","sourceRoot":"","sources":["../../src/transformers/MediaPipeHolisticTrackerTransformer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAoB,MAAM,qBAAqB,CAAC;AACjE,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAQlD,MAAM,CAAC,OAAO,OAAO,mCAAoC,SAAQ,gBAAgB;IAKxE,MAAM,KAAK,WAAW;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,YAAY,EAAE,eAAe,EAAE,QAAQ,EAA8C;QACnF,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,eAAe,GAAG,eAAe,IAAI,EAAE,CAAC;IAC/C,CAAC;IAED,IAAI,CAAC,EAAE,UAAU,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"MediaPipeHolisticTrackerTransformer.js","sourceRoot":"","sources":["../../src/transformers/MediaPipeHolisticTrackerTransformer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAoB,MAAM,qBAAqB,CAAC;AACjE,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAQlD,MAAM,CAAC,OAAO,OAAO,mCAAoC,SAAQ,gBAAgB;IAKxE,MAAM,KAAK,WAAW;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,YAAY,EAAE,eAAe,EAAE,QAAQ,EAA8C;QACnF,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,eAAe,GAAG,eAAe,IAAI,EAAE,CAAC;IAC/C,CAAC;IAED,IAAI,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAA+B;QAC1E,KAAK,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,CAAC;QAEvD,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC;YAC3B,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,oDAAoD,IAAI,EAAE;SACjF,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE;YAC5B,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,iCAAiC,CAAC,IAAI,CAAC,UAAW,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,OAAO;;QACX,IAAI,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;QAC3B,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;QACtB,MAAM,CAAA,MAAA,IAAI,CAAC,QAAQ,0CAAE,KAAK,EAAE,CAAA,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,SAAS;QACb,OAAO;IACT,CAAC;IAED,KAAK,CAAC,iCAAiC,CAAC,OAAyB;;QAC/D,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB,IAAI,OAAO,CAAC,UAAU,GAAG,CAAC,IAAI,OAAO,CAAC,WAAW,GAAG,CAAC,EAAE;gBACrD,MAAM,CAAA,MAAA,IAAI,CAAC,QAAQ,0CAAE,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA,CAAC;aAC/C;YAED,OAAO,CAAC,yBAAyB,CAAC,GAAG,EAAE;gBACrC,IAAI,CAAC,iCAAiC,CAAC,OAAO,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;SACJ;IACH,CAAC;CACF"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/// <reference types="dom-webcodecs" />
|
|
2
|
-
import {
|
|
3
|
-
export default abstract class VideoTransformer implements
|
|
2
|
+
import { VideoTrackTransformer, VideoTransformerInitOptions } from './types';
|
|
3
|
+
export default abstract class VideoTransformer implements VideoTrackTransformer {
|
|
4
4
|
transformer?: TransformStream;
|
|
5
5
|
canvas?: OffscreenCanvas;
|
|
6
6
|
ctx?: OffscreenCanvasRenderingContext2D;
|
|
7
7
|
inputVideo?: HTMLVideoElement;
|
|
8
8
|
protected isDisabled?: Boolean;
|
|
9
|
-
init({ outputCanvas, inputVideo }:
|
|
9
|
+
init({ outputCanvas, inputElement: inputVideo }: VideoTransformerInitOptions): void;
|
|
10
10
|
destroy(): Promise<void>;
|
|
11
11
|
abstract transform(frame: VideoFrame, controller: TransformStreamDefaultController<VideoFrame>): void;
|
|
12
12
|
}
|
|
@@ -2,8 +2,11 @@ export default class VideoTransformer {
|
|
|
2
2
|
constructor() {
|
|
3
3
|
this.isDisabled = false;
|
|
4
4
|
}
|
|
5
|
-
init({ outputCanvas, inputVideo }) {
|
|
5
|
+
init({ outputCanvas, inputElement: inputVideo }) {
|
|
6
6
|
var _a;
|
|
7
|
+
if (!(inputVideo instanceof HTMLVideoElement)) {
|
|
8
|
+
throw TypeError('Video transformer needs a HTMLVideoElement as input');
|
|
9
|
+
}
|
|
7
10
|
this.transformer = new TransformStream({
|
|
8
11
|
transform: (frame, controller) => this.transform(frame, controller),
|
|
9
12
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VideoTransformer.js","sourceRoot":"","sources":["../../src/transformers/VideoTransformer.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAgB,gBAAgB;IAA9C;QASY,eAAU,GAAa,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"VideoTransformer.js","sourceRoot":"","sources":["../../src/transformers/VideoTransformer.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAgB,gBAAgB;IAA9C;QASY,eAAU,GAAa,KAAK,CAAC;IA2BzC,CAAC;IAzBC,IAAI,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAA+B;;QAC1E,IAAI,CAAC,CAAC,UAAU,YAAY,gBAAgB,CAAC,EAAE;YAC7C,MAAM,SAAS,CAAC,qDAAqD,CAAC,CAAC;SACxE;QACD,IAAI,CAAC,WAAW,GAAG,IAAI,eAAe,CAAC;YACrC,SAAS,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU,CAAC;SACpE,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,GAAG,YAAY,IAAI,IAAI,CAAC;QACnC,IAAI,YAAY,EAAE;YAChB,IAAI,CAAC,GAAG,GAAG,CAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,UAAU,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,KAAI,SAAS,CAAC;SACjF;QACD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC;IACvB,CAAC;CAMF"}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
/// <reference types="dom-webcodecs" />
|
|
2
|
-
export type
|
|
3
|
-
|
|
4
|
-
inputVideo: HTMLVideoElement;
|
|
2
|
+
export type TrackTransformerInitOptions = {
|
|
3
|
+
inputElement: HTMLMediaElement;
|
|
5
4
|
};
|
|
6
|
-
export interface
|
|
7
|
-
|
|
5
|
+
export interface VideoTransformerInitOptions extends TrackTransformerInitOptions {
|
|
6
|
+
outputCanvas: OffscreenCanvas;
|
|
7
|
+
inputElement: HTMLVideoElement;
|
|
8
|
+
}
|
|
9
|
+
export interface VideoTrackTransformer<T extends TrackTransformerInitOptions = VideoTransformerInitOptions> {
|
|
10
|
+
init: (options: T) => void;
|
|
8
11
|
destroy: () => void;
|
|
9
12
|
transform: (frame: VideoFrame, controller: TransformStreamDefaultController) => void;
|
|
10
13
|
transformer?: TransformStream;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@livekit/track-processors",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "LiveKit track processors",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"source": "src/index.ts",
|
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
"src"
|
|
22
22
|
],
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@mediapipe/holistic": "
|
|
25
|
-
"@mediapipe/tasks-vision": "
|
|
24
|
+
"@mediapipe/holistic": "0.5.1675471629",
|
|
25
|
+
"@mediapipe/tasks-vision": "0.10.1"
|
|
26
26
|
},
|
|
27
27
|
"peerDependencies": {
|
|
28
28
|
"livekit-client": "^1.10.0"
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as vision from '@mediapipe/tasks-vision';
|
|
2
|
+
import { dependencies } from '../../package.json';
|
|
2
3
|
import VideoTransformer from './VideoTransformer';
|
|
3
4
|
import { VideoTransformerInitOptions } from './types';
|
|
4
5
|
|
|
@@ -33,7 +34,7 @@ export default class BackgroundProcessor extends VideoTransformer {
|
|
|
33
34
|
super.init({ outputCanvas, inputElement: inputVideo });
|
|
34
35
|
|
|
35
36
|
const fileSet = await vision.FilesetResolver.forVisionTasks(
|
|
36
|
-
|
|
37
|
+
`https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@${dependencies['@mediapipe/tasks-vision']}/wasm`,
|
|
37
38
|
);
|
|
38
39
|
|
|
39
40
|
this.imageSegmenter = await vision.ImageSegmenter.createFromOptions(fileSet, {
|
|
@@ -145,7 +146,6 @@ export default class BackgroundProcessor extends VideoTransformer {
|
|
|
145
146
|
}
|
|
146
147
|
|
|
147
148
|
async blurBackground(frame: VideoFrame) {
|
|
148
|
-
const start = performance.now();
|
|
149
149
|
if (
|
|
150
150
|
!this.ctx ||
|
|
151
151
|
!this.canvas ||
|
|
@@ -172,7 +172,6 @@ export default class BackgroundProcessor extends VideoTransformer {
|
|
|
172
172
|
this.ctx.filter = `blur(${this.blurRadius}px)`;
|
|
173
173
|
this.ctx.drawImage(frame, 0, 0);
|
|
174
174
|
this.ctx.restore();
|
|
175
|
-
console.log('draw time', performance.now() - start);
|
|
176
175
|
}
|
|
177
176
|
}
|
|
178
177
|
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/// <reference types="dom-webcodecs" />
|
|
2
|
-
import { SelfieSegmentation, Results } from '@mediapipe/selfie_segmentation';
|
|
3
|
-
export declare type BlurOptions = {
|
|
4
|
-
blurRadius?: number;
|
|
5
|
-
backgroundImage?: string;
|
|
6
|
-
};
|
|
7
|
-
export default class BackgroundProcessor {
|
|
8
|
-
transformer: TransformStream;
|
|
9
|
-
selfieSegmentation?: SelfieSegmentation;
|
|
10
|
-
segmentationResults: Results | undefined;
|
|
11
|
-
canvas?: OffscreenCanvas;
|
|
12
|
-
ctx?: OffscreenCanvasRenderingContext2D;
|
|
13
|
-
backgroundImage: ImageBitmap | null;
|
|
14
|
-
inputVideo?: HTMLVideoElement;
|
|
15
|
-
blurRadius?: number;
|
|
16
|
-
constructor(opts: BlurOptions);
|
|
17
|
-
init(outputCanvas: OffscreenCanvas, inputVideo: HTMLVideoElement): void;
|
|
18
|
-
sendFramesContinuouslyForSegmentation(videoEl: HTMLVideoElement): void;
|
|
19
|
-
loadBackground(path: string): Promise<void>;
|
|
20
|
-
transform(frame: VideoFrame, controller: TransformStreamDefaultController<VideoFrame>): Promise<void>;
|
|
21
|
-
drawVirtualBackground(frame: VideoFrame): void;
|
|
22
|
-
blurBackground(frame: VideoFrame): void;
|
|
23
|
-
}
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
const selfie_segmentation_1 = require("@mediapipe/selfie_segmentation");
|
|
13
|
-
class BackgroundProcessor {
|
|
14
|
-
constructor(opts) {
|
|
15
|
-
// backgroundImagePattern: CanvasPattern | null = null;
|
|
16
|
-
this.backgroundImage = null;
|
|
17
|
-
this.transformer = new TransformStream({
|
|
18
|
-
transform: (frame, controller) => this.transform(frame, controller),
|
|
19
|
-
});
|
|
20
|
-
if (opts.blurRadius) {
|
|
21
|
-
this.blurRadius = opts.blurRadius;
|
|
22
|
-
}
|
|
23
|
-
else if (opts.backgroundImage) {
|
|
24
|
-
this.loadBackground(opts.backgroundImage);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
init(outputCanvas, inputVideo) {
|
|
28
|
-
this.canvas = outputCanvas;
|
|
29
|
-
this.ctx = this.canvas.getContext('2d');
|
|
30
|
-
this.inputVideo = inputVideo;
|
|
31
|
-
this.selfieSegmentation = new selfie_segmentation_1.SelfieSegmentation({ locateFile: (file) => `https://cdn.jsdelivr.net/npm/@mediapipe/selfie_segmentation/${file}` });
|
|
32
|
-
this.selfieSegmentation.setOptions({
|
|
33
|
-
modelSelection: 1,
|
|
34
|
-
selfieMode: false,
|
|
35
|
-
});
|
|
36
|
-
this.selfieSegmentation.onResults((results) => { this.segmentationResults = results; });
|
|
37
|
-
// this.loadBackground(opts.backgroundUrl).catch((e) => console.error(e));
|
|
38
|
-
this.sendFramesContinuouslyForSegmentation(this.inputVideo);
|
|
39
|
-
}
|
|
40
|
-
sendFramesContinuouslyForSegmentation(videoEl) {
|
|
41
|
-
var _a;
|
|
42
|
-
// @ts-ignore
|
|
43
|
-
videoEl.requestVideoFrameCallback(() => this.sendFramesContinuouslyForSegmentation(videoEl));
|
|
44
|
-
(_a = this.selfieSegmentation) === null || _a === void 0 ? void 0 : _a.send({ image: videoEl });
|
|
45
|
-
}
|
|
46
|
-
loadBackground(path) {
|
|
47
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
48
|
-
const img = new Image();
|
|
49
|
-
yield new Promise((resolve, reject) => {
|
|
50
|
-
img.crossOrigin = 'Anonymous';
|
|
51
|
-
img.onload = () => resolve(img);
|
|
52
|
-
img.onerror = (err) => reject(err);
|
|
53
|
-
img.src = path;
|
|
54
|
-
});
|
|
55
|
-
const imageData = yield createImageBitmap(img);
|
|
56
|
-
this.backgroundImage = imageData;
|
|
57
|
-
// this.backgroundImagePattern = this.ctx?.createPattern(imageData, 'repeat') ?? null;
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
transform(frame, controller) {
|
|
61
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
62
|
-
if (this.blurRadius) {
|
|
63
|
-
this.blurBackground(frame);
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
this.drawVirtualBackground(frame);
|
|
67
|
-
}
|
|
68
|
-
// @ts-ignore
|
|
69
|
-
const newFrame = new VideoFrame(this.canvas, { timestamp: performance.now() });
|
|
70
|
-
frame.close();
|
|
71
|
-
controller.enqueue(newFrame);
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
drawVirtualBackground(frame) {
|
|
75
|
-
if (!this.canvas || !this.ctx)
|
|
76
|
-
return;
|
|
77
|
-
// this.ctx.save();
|
|
78
|
-
// this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
|
|
79
|
-
if (this.segmentationResults) {
|
|
80
|
-
this.ctx.filter = 'blur(3px)';
|
|
81
|
-
this.ctx.globalCompositeOperation = 'copy';
|
|
82
|
-
this.ctx.drawImage(this.segmentationResults.segmentationMask, 0, 0);
|
|
83
|
-
this.ctx.filter = 'none';
|
|
84
|
-
this.ctx.globalCompositeOperation = 'source-out';
|
|
85
|
-
if (this.backgroundImage) {
|
|
86
|
-
this.ctx.drawImage(this.backgroundImage, 0, 0, this.backgroundImage.width, this.backgroundImage.height, 0, 0, this.canvas.width, this.canvas.height);
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
this.ctx.fillStyle = '#00FF00';
|
|
90
|
-
this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);
|
|
91
|
-
}
|
|
92
|
-
this.ctx.globalCompositeOperation = 'destination-over';
|
|
93
|
-
}
|
|
94
|
-
this.ctx.drawImage(frame, 0, 0, this.canvas.width, this.canvas.height);
|
|
95
|
-
// this.ctx.restore();
|
|
96
|
-
}
|
|
97
|
-
blurBackground(frame) {
|
|
98
|
-
if (!this.ctx || !this.canvas || !this.segmentationResults)
|
|
99
|
-
return;
|
|
100
|
-
this.ctx.save();
|
|
101
|
-
this.ctx.filter = `blur(${this.blurRadius}px)`;
|
|
102
|
-
this.ctx.globalCompositeOperation = 'copy';
|
|
103
|
-
this.ctx.drawImage(this.segmentationResults.segmentationMask, 0, 0, this.canvas.width, this.canvas.height);
|
|
104
|
-
this.ctx.filter = 'none';
|
|
105
|
-
this.ctx.globalCompositeOperation = 'source-in';
|
|
106
|
-
this.ctx.drawImage(frame, 0, 0, this.canvas.width, this.canvas.height);
|
|
107
|
-
this.ctx.globalCompositeOperation = 'destination-over';
|
|
108
|
-
this.ctx.filter = 'blur(10px)';
|
|
109
|
-
this.ctx.drawImage(frame, 0, 0);
|
|
110
|
-
this.ctx.restore();
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
exports.default = BackgroundProcessor;
|
|
114
|
-
//# sourceMappingURL=BackgroundProcessor.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BackgroundProcessor.js","sourceRoot":"","sources":["../src/BackgroundProcessor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/// <reference types="dom-mediacapture-transform" />
|
|
2
|
-
/// <reference types="dom-webcodecs" />
|
|
3
|
-
import { SelfieSegmentation, Results } from '@mediapipe/selfie_segmentation';
|
|
4
|
-
import type { ProcessorOptions, VideoProcessor } from 'livekit-client';
|
|
5
|
-
export declare type VirtualBackgroundOptions = ProcessorOptions & {
|
|
6
|
-
backgroundUrl: string;
|
|
7
|
-
};
|
|
8
|
-
export declare class VirtualBackgroundProcessor implements VideoProcessor<VirtualBackgroundOptions> {
|
|
9
|
-
source?: MediaStreamVideoTrack;
|
|
10
|
-
sourceSettings?: MediaTrackSettings;
|
|
11
|
-
processor?: MediaStreamTrackProcessor<VideoFrame>;
|
|
12
|
-
trackGenerator?: MediaStreamTrackGenerator<VideoFrame>;
|
|
13
|
-
canvas?: OffscreenCanvas;
|
|
14
|
-
ctx?: OffscreenCanvasRenderingContext2D;
|
|
15
|
-
sourceDummy?: HTMLVideoElement;
|
|
16
|
-
transformer?: TransformStream;
|
|
17
|
-
selfieSegmentation?: SelfieSegmentation;
|
|
18
|
-
backgroundImagePattern: CanvasPattern | null;
|
|
19
|
-
processedTrack?: MediaStreamTrack;
|
|
20
|
-
init(opts: VirtualBackgroundOptions): void;
|
|
21
|
-
destroy(): void;
|
|
22
|
-
sendFramesContinuouslyForSegmentation(videoEl: HTMLVideoElement): void;
|
|
23
|
-
loadBackground(path: string): Promise<void>;
|
|
24
|
-
segmentationResults: Results | undefined;
|
|
25
|
-
drawResults(frame: VideoFrame): void;
|
|
26
|
-
blurBackground(frame: VideoFrame): void;
|
|
27
|
-
transform(frame: VideoFrame, controller: TransformStreamDefaultController<VideoFrame>): Promise<void>;
|
|
28
|
-
}
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.VirtualBackgroundProcessor = void 0;
|
|
13
|
-
const selfie_segmentation_1 = require("@mediapipe/selfie_segmentation");
|
|
14
|
-
class VirtualBackgroundProcessor {
|
|
15
|
-
constructor() {
|
|
16
|
-
this.backgroundImagePattern = null;
|
|
17
|
-
}
|
|
18
|
-
init(opts) {
|
|
19
|
-
this.source = opts.track;
|
|
20
|
-
this.sourceSettings = this.source.getSettings();
|
|
21
|
-
this.sourceDummy = opts.element;
|
|
22
|
-
// TODO explore if we can do all the processing work in a webworker
|
|
23
|
-
this.processor = new MediaStreamTrackProcessor({ track: this.source });
|
|
24
|
-
this.trackGenerator = new MediaStreamTrackGenerator({ kind: 'video' });
|
|
25
|
-
this.transformer = new TransformStream({
|
|
26
|
-
transform: (frame, controller) => this.transform(frame, controller),
|
|
27
|
-
});
|
|
28
|
-
this.processor.readable.pipeThrough(this.transformer).pipeTo(this.trackGenerator.writable);
|
|
29
|
-
this.processedTrack = this.trackGenerator;
|
|
30
|
-
this.canvas = new OffscreenCanvas(this.sourceSettings.width, this.sourceSettings.height);
|
|
31
|
-
this.ctx = this.canvas.getContext('2d');
|
|
32
|
-
this.selfieSegmentation = new selfie_segmentation_1.SelfieSegmentation({ locateFile: (file) => `https://cdn.jsdelivr.net/npm/@mediapipe/selfie_segmentation/${file}` });
|
|
33
|
-
this.selfieSegmentation.setOptions({
|
|
34
|
-
modelSelection: 1,
|
|
35
|
-
selfieMode: false,
|
|
36
|
-
});
|
|
37
|
-
this.selfieSegmentation.onResults((results) => { this.segmentationResults = results; });
|
|
38
|
-
this.loadBackground(opts.backgroundUrl).catch((e) => console.error(e));
|
|
39
|
-
this.sendFramesContinuouslyForSegmentation(this.sourceDummy);
|
|
40
|
-
}
|
|
41
|
-
destroy() {
|
|
42
|
-
// TODO
|
|
43
|
-
}
|
|
44
|
-
sendFramesContinuouslyForSegmentation(videoEl) {
|
|
45
|
-
var _a;
|
|
46
|
-
// @ts-ignore
|
|
47
|
-
videoEl.requestVideoFrameCallback(() => this.sendFramesContinuouslyForSegmentation(videoEl));
|
|
48
|
-
(_a = this.selfieSegmentation) === null || _a === void 0 ? void 0 : _a.send({ image: videoEl });
|
|
49
|
-
}
|
|
50
|
-
loadBackground(path) {
|
|
51
|
-
var _a, _b;
|
|
52
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
53
|
-
const img = new Image();
|
|
54
|
-
yield new Promise((resolve, reject) => {
|
|
55
|
-
img.crossOrigin = 'Anonymous';
|
|
56
|
-
img.onload = () => resolve(img);
|
|
57
|
-
img.onerror = (err) => reject(err);
|
|
58
|
-
img.src = path;
|
|
59
|
-
});
|
|
60
|
-
const imageData = yield createImageBitmap(img);
|
|
61
|
-
this.backgroundImagePattern = (_b = (_a = this.ctx) === null || _a === void 0 ? void 0 : _a.createPattern(imageData, 'repeat')) !== null && _b !== void 0 ? _b : null;
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
drawResults(frame) {
|
|
65
|
-
var _a;
|
|
66
|
-
if (!this.canvas || !this.ctx)
|
|
67
|
-
return;
|
|
68
|
-
// this.ctx.save();
|
|
69
|
-
// this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
|
|
70
|
-
if (this.segmentationResults) {
|
|
71
|
-
this.ctx.filter = 'blur(3px)';
|
|
72
|
-
this.ctx.globalCompositeOperation = 'copy';
|
|
73
|
-
this.ctx.drawImage(this.segmentationResults.segmentationMask, 0, 0);
|
|
74
|
-
this.ctx.filter = 'none';
|
|
75
|
-
this.ctx.globalCompositeOperation = 'source-out';
|
|
76
|
-
this.ctx.fillStyle = (_a = this.backgroundImagePattern) !== null && _a !== void 0 ? _a : '#00FF00';
|
|
77
|
-
this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);
|
|
78
|
-
this.ctx.globalCompositeOperation = 'destination-over';
|
|
79
|
-
}
|
|
80
|
-
this.ctx.drawImage(frame, 0, 0, this.canvas.width, this.canvas.height);
|
|
81
|
-
// this.ctx.restore();
|
|
82
|
-
}
|
|
83
|
-
blurBackground(frame) {
|
|
84
|
-
if (!this.ctx || !this.canvas || !this.segmentationResults)
|
|
85
|
-
return;
|
|
86
|
-
this.ctx.save();
|
|
87
|
-
this.ctx.filter = 'blur(3px)';
|
|
88
|
-
this.ctx.globalCompositeOperation = 'copy';
|
|
89
|
-
this.ctx.drawImage(this.segmentationResults.segmentationMask, 0, 0, this.canvas.width, this.canvas.height);
|
|
90
|
-
this.ctx.filter = 'none';
|
|
91
|
-
this.ctx.globalCompositeOperation = 'source-in';
|
|
92
|
-
this.ctx.drawImage(frame, 0, 0, this.canvas.width, this.canvas.height);
|
|
93
|
-
this.ctx.globalCompositeOperation = 'destination-over';
|
|
94
|
-
this.ctx.filter = 'blur(10px)';
|
|
95
|
-
this.ctx.drawImage(frame, 0, 0);
|
|
96
|
-
this.ctx.restore();
|
|
97
|
-
}
|
|
98
|
-
transform(frame, controller) {
|
|
99
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
100
|
-
this.drawResults(frame);
|
|
101
|
-
// this.blurBackground(frame);
|
|
102
|
-
// @ts-ignore
|
|
103
|
-
const newFrame = new VideoFrame(this.canvas, { timestamp: performance.now() });
|
|
104
|
-
frame.close();
|
|
105
|
-
controller.enqueue(newFrame);
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
exports.VirtualBackgroundProcessor = VirtualBackgroundProcessor;
|
|
110
|
-
//# sourceMappingURL=BaseVideoProcessor.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BaseVideoProcessor.js","sourceRoot":"","sources":["../src/BaseVideoProcessor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|