@revideo/renderer 0.4.1-cat.995 → 0.4.1
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/lib/server/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/lib/client/FFmpegExporterClient.d.ts +0 -46
- package/lib/client/FFmpegExporterClient.d.ts.map +0 -1
- package/lib/client/FFmpegExporterClient.js +0 -118
- package/lib/client/ffpmeg.d.ts +0 -3
- package/lib/client/ffpmeg.d.ts.map +0 -1
- package/lib/client/ffpmeg.js +0 -9
- package/lib/client/index.d.ts +0 -3
- package/lib/client/index.d.ts.map +0 -1
- package/lib/client/index.js +0 -9
- package/lib/index.js +0 -5
- package/lib/index.js.map +0 -1
- package/lib/server/RendererPlugin.d.ts +0 -3
- package/lib/server/RendererPlugin.d.ts.map +0 -1
- package/lib/server/RendererPlugin.js +0 -50
- package/lib/server/ffmpeg/FFmpegBridge.d.ts +0 -22
- package/lib/server/ffmpeg/FFmpegBridge.d.ts.map +0 -1
- package/lib/server/ffmpeg/FFmpegBridge.js +0 -92
- package/lib/server/ffmpeg/FFmpegExporterServer.d.ts +0 -39
- package/lib/server/ffmpeg/FFmpegExporterServer.d.ts.map +0 -1
- package/lib/server/ffmpeg/FFmpegExporterServer.js +0 -264
- package/lib/server/ffmpeg/FFmpegPlugin.d.ts +0 -3
- package/lib/server/ffmpeg/FFmpegPlugin.d.ts.map +0 -1
- package/lib/server/ffmpeg/FFmpegPlugin.js +0 -23
- package/lib/server/ffmpeg/ImageStream.d.ts +0 -10
- package/lib/server/ffmpeg/ImageStream.d.ts.map +0 -1
- package/lib/server/ffmpeg/ImageStream.js +0 -25
- package/lib/server/ffmpeg/VideoFrameExtractor.d.ts +0 -41
- package/lib/server/ffmpeg/VideoFrameExtractor.d.ts.map +0 -1
- package/lib/server/ffmpeg/VideoFrameExtractor.js +0 -148
- package/lib/server/ffmpeg/utils.d.ts +0 -8
- package/lib/server/ffmpeg/utils.d.ts.map +0 -1
- package/lib/server/ffmpeg/utils.js +0 -141
- package/lib/server/renderVideo.d.ts +0 -10
- package/lib/server/renderVideo.d.ts.map +0 -1
- package/lib/server/renderVideo.js +0 -124
- package/lib/server/utils.d.ts +0 -3
- package/lib/server/utils.d.ts.map +0 -1
- package/lib/server/utils.js +0 -20
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ffpmeg.d.ts","sourceRoot":"","sources":["../../client/ffpmeg.ts"],"names":[],"mappings":";AAIA,wBAKG"}
|
package/lib/client/ffpmeg.js
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { makePlugin } from '@revideo/core';
|
|
2
|
-
import { FFmpegExporterClient } from './FFmpegExporterClient';
|
|
3
|
-
export default makePlugin({
|
|
4
|
-
name: 'ffmpeg-plugin',
|
|
5
|
-
exporters() {
|
|
6
|
-
return [FFmpegExporterClient];
|
|
7
|
-
},
|
|
8
|
-
});
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmZwbWVnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vY2xpZW50L2ZmcG1lZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRTVELGVBQWUsVUFBVSxDQUFDO0lBQ3hCLElBQUksRUFBRSxlQUFlO0lBQ3JCLFNBQVM7UUFDUCxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUNoQyxDQUFDO0NBQ0YsQ0FBQyxDQUFDIn0=
|
package/lib/client/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../client/index.ts"],"names":[],"mappings":";AAIA,wBAKG"}
|
package/lib/client/index.js
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { makePlugin } from '@revideo/core';
|
|
2
|
-
import { FFmpegExporterClient } from './FFmpegExporterClient';
|
|
3
|
-
export default makePlugin({
|
|
4
|
-
name: 'ffmpeg-plugin',
|
|
5
|
-
exporters() {
|
|
6
|
-
return [FFmpegExporterClient];
|
|
7
|
-
},
|
|
8
|
-
});
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9jbGllbnQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUU1RCxlQUFlLFVBQVUsQ0FBQztJQUN4QixJQUFJLEVBQUUsZUFBZTtJQUNyQixTQUFTO1FBQ1AsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDaEMsQ0FBQztDQUNGLENBQUMsQ0FBQyJ9
|
package/lib/index.js
DELETED
package/lib/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../server/index.ts"],"sourcesContent":[null],"names":["tslib_1","__exportStar","require","exports"],"mappings":"gFAMAA,EAAuBC,aAAAC,QAAA,UAAAC,SACvBH,EAAyBC,aAAAC,QAAA,YAAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RendererPlugin.d.ts","sourceRoot":"","sources":["../../server/RendererPlugin.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,MAAM,EAAC,MAAM,MAAM,CAAC;AAU5B,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAsCvE"}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.rendererPlugin = void 0;
|
|
4
|
-
const fs = require("fs");
|
|
5
|
-
const path = require("path");
|
|
6
|
-
const RendererPath = path.resolve(__dirname, '../renderer.html');
|
|
7
|
-
const Content = fs.readFileSync(RendererPath, 'utf-8');
|
|
8
|
-
const HtmlParts = Content.toString().split('{{source}}');
|
|
9
|
-
function createHtml(src) {
|
|
10
|
-
return HtmlParts[0] + src + HtmlParts[1];
|
|
11
|
-
}
|
|
12
|
-
function rendererPlugin(params) {
|
|
13
|
-
return {
|
|
14
|
-
name: 'revideo-renderer-plugin',
|
|
15
|
-
async load(id) {
|
|
16
|
-
if (id.startsWith('\x00virtual:renderer')) {
|
|
17
|
-
return `\
|
|
18
|
-
import {render} from '@revideo/renderer/lib/client/render';
|
|
19
|
-
import project from './src/project.ts?project';
|
|
20
|
-
|
|
21
|
-
// Read video variables
|
|
22
|
-
project.variables = ${params ? `JSON.parse(\`${JSON.stringify(params)}\`)` : 'project.variables'};
|
|
23
|
-
|
|
24
|
-
// Check range of frames to render
|
|
25
|
-
const url = new URL(window.location.href);
|
|
26
|
-
|
|
27
|
-
const fileName = url.searchParams.get('fileName');
|
|
28
|
-
const workerId = url.searchParams.get('workerId');
|
|
29
|
-
const totalNumOfWorkers = url.searchParams.get('totalNumOfWorkers');
|
|
30
|
-
const startInSeconds = parseFloat(url.searchParams.get('startInSeconds'));
|
|
31
|
-
const endInSeconds = parseFloat(url.searchParams.get('endInSeconds'));
|
|
32
|
-
const hiddenFolderId = url.searchParams.get('hiddenFolderId');
|
|
33
|
-
|
|
34
|
-
// Overwrite project name so that the rendered videos don't overwrite each other
|
|
35
|
-
project.name = fileName;
|
|
36
|
-
|
|
37
|
-
render(project, workerId, totalNumOfWorkers, startInSeconds, endInSeconds, hiddenFolderId);
|
|
38
|
-
`;
|
|
39
|
-
}
|
|
40
|
-
},
|
|
41
|
-
configureServer(server) {
|
|
42
|
-
server.middlewares.use('/render', (_req, res) => {
|
|
43
|
-
res.setHeader('Content-Type', 'text/html');
|
|
44
|
-
res.end(createHtml(`/@id/__x00__virtual:renderer`));
|
|
45
|
-
});
|
|
46
|
-
},
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
exports.rendererPlugin = rendererPlugin;
|
|
50
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVuZGVyZXJQbHVnaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zZXJ2ZXIvUmVuZGVyZXJQbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUc3QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0FBQ2pFLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7QUFFekQsU0FBUyxVQUFVLENBQUMsR0FBVztJQUM3QixPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNDLENBQUM7QUFFRCxTQUFnQixjQUFjLENBQUMsTUFBZ0M7SUFDN0QsT0FBTztRQUNMLElBQUksRUFBRSx5QkFBeUI7UUFFL0IsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ1gsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQztnQkFDMUMsT0FBTzs7Ozs7a0NBS21CLE1BQU0sQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsbUJBQW1COzs7Ozs7Ozs7Ozs7Ozs7O2FBZ0IvRixDQUFDO1lBQ1IsQ0FBQztRQUNILENBQUM7UUFFRCxlQUFlLENBQUMsTUFBTTtZQUNwQixNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQzlDLEdBQUcsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUMzQyxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLENBQUM7WUFDdEQsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUF0Q0Qsd0NBc0NDIn0=
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { PluginConfig } from '@revideo/vite-plugin/lib/plugins';
|
|
2
|
-
import type { WebSocketServer } from 'vite';
|
|
3
|
-
/**
|
|
4
|
-
* A simple bridge between the FFmpegExporterServer and FFmpegExporterClient.
|
|
5
|
-
*
|
|
6
|
-
* @remarks
|
|
7
|
-
* This class lets the client exporter invoke methods on the server and receive
|
|
8
|
-
* responses using a simple Promise-based API.
|
|
9
|
-
*/
|
|
10
|
-
export declare class FFmpegBridge {
|
|
11
|
-
private readonly ws;
|
|
12
|
-
private readonly config;
|
|
13
|
-
private process;
|
|
14
|
-
constructor(ws: WebSocketServer, config: PluginConfig);
|
|
15
|
-
private handleMessage;
|
|
16
|
-
private respondSuccess;
|
|
17
|
-
private respondError;
|
|
18
|
-
private videoFrameExtractors;
|
|
19
|
-
private handleVideoFrameMessage;
|
|
20
|
-
private handleRenderFinished;
|
|
21
|
-
}
|
|
22
|
-
//# sourceMappingURL=FFmpegBridge.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FFmpegBridge.d.ts","sourceRoot":"","sources":["../../../server/ffmpeg/FFmpegBridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,kCAAkC,CAAC;AAC9D,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,MAAM,CAAC;AAY1C;;;;;;GAMG;AACH,qBAAa,YAAY;IAIrB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJzB,OAAO,CAAC,OAAO,CAAqC;gBAGjC,EAAE,EAAE,eAAe,EACnB,MAAM,EAAE,YAAY;IAOvC,OAAO,CAAC,aAAa,CAkCnB;IAEF,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,oBAAoB,CAA0C;IAEtE,OAAO,CAAC,uBAAuB,CAgC7B;IAEF,OAAO,CAAC,oBAAoB,CAG1B;CACH"}
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.FFmpegBridge = void 0;
|
|
4
|
-
const FFmpegExporterServer_1 = require("./FFmpegExporterServer");
|
|
5
|
-
const VideoFrameExtractor_1 = require("./VideoFrameExtractor");
|
|
6
|
-
/**
|
|
7
|
-
* A simple bridge between the FFmpegExporterServer and FFmpegExporterClient.
|
|
8
|
-
*
|
|
9
|
-
* @remarks
|
|
10
|
-
* This class lets the client exporter invoke methods on the server and receive
|
|
11
|
-
* responses using a simple Promise-based API.
|
|
12
|
-
*/
|
|
13
|
-
class FFmpegBridge {
|
|
14
|
-
constructor(ws, config) {
|
|
15
|
-
this.ws = ws;
|
|
16
|
-
this.config = config;
|
|
17
|
-
this.process = null;
|
|
18
|
-
this.handleMessage = async ({ method, data }) => {
|
|
19
|
-
if (method === 'start') {
|
|
20
|
-
try {
|
|
21
|
-
this.process = new FFmpegExporterServer_1.FFmpegExporterServer(data, this.config);
|
|
22
|
-
this.respondSuccess(method, await this.process.start());
|
|
23
|
-
}
|
|
24
|
-
catch (e) {
|
|
25
|
-
this.respondError(method, e?.message);
|
|
26
|
-
}
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
if (!this.process) {
|
|
30
|
-
this.respondError(method, 'The exporting process has not been started.');
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
if (!(method in this.process)) {
|
|
34
|
-
this.respondError(method, `Unknown method: "${method}".`);
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
try {
|
|
38
|
-
this.respondSuccess(method, await this.process[method](data));
|
|
39
|
-
}
|
|
40
|
-
catch (e) {
|
|
41
|
-
this.respondError(method, e?.message);
|
|
42
|
-
}
|
|
43
|
-
if (method === 'kill') {
|
|
44
|
-
this.process = null;
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
// List of VideoFrameExtractors
|
|
49
|
-
this.videoFrameExtractors = new Map();
|
|
50
|
-
this.handleVideoFrameMessage = async ({ data }) => {
|
|
51
|
-
const typedData = data;
|
|
52
|
-
// Check if we already have a VideoFrameExtractor for this video
|
|
53
|
-
const id = typedData.filePath + '-' + typedData.id;
|
|
54
|
-
let extractor = this.videoFrameExtractors.get(id);
|
|
55
|
-
if (!extractor) {
|
|
56
|
-
extractor = new VideoFrameExtractor_1.VideoFrameExtractor(typedData.filePath, typedData.startTime, typedData.fps, typedData.duration);
|
|
57
|
-
this.videoFrameExtractors.set(id, extractor);
|
|
58
|
-
}
|
|
59
|
-
// Go to the frame that is closest to the requested time
|
|
60
|
-
const frame = await extractor.popImage();
|
|
61
|
-
this.ws.send('revideo:ffmpeg-video-frame-res', {
|
|
62
|
-
status: 'success',
|
|
63
|
-
data: {
|
|
64
|
-
frame,
|
|
65
|
-
},
|
|
66
|
-
});
|
|
67
|
-
};
|
|
68
|
-
this.handleRenderFinished = async () => {
|
|
69
|
-
this.videoFrameExtractors.forEach(extractor => extractor.destroy());
|
|
70
|
-
this.videoFrameExtractors.clear();
|
|
71
|
-
};
|
|
72
|
-
ws.on('revideo:ffmpeg-exporter', this.handleMessage);
|
|
73
|
-
ws.on('revideo:ffmpeg-video-frame', this.handleVideoFrameMessage);
|
|
74
|
-
ws.on('revideo:render-finished', this.handleRenderFinished);
|
|
75
|
-
}
|
|
76
|
-
respondSuccess(method, data = {}) {
|
|
77
|
-
this.ws.send('revideo:ffmpeg-exporter-ack', {
|
|
78
|
-
status: 'success',
|
|
79
|
-
method,
|
|
80
|
-
data,
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
respondError(method, message = 'Unknown error.') {
|
|
84
|
-
this.ws.send('revideo:ffmpeg-exporter-ack', {
|
|
85
|
-
status: 'error',
|
|
86
|
-
method,
|
|
87
|
-
message,
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
exports.FFmpegBridge = FFmpegBridge;
|
|
92
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRkZtcGVnQnJpZGdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc2VydmVyL2ZmbXBlZy9GRm1wZWdCcmlkZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsaUVBR2dDO0FBQ2hDLCtEQUEwRDtBQU8xRDs7Ozs7O0dBTUc7QUFDSCxNQUFhLFlBQVk7SUFHdkIsWUFDbUIsRUFBbUIsRUFDbkIsTUFBb0I7UUFEcEIsT0FBRSxHQUFGLEVBQUUsQ0FBaUI7UUFDbkIsV0FBTSxHQUFOLE1BQU0sQ0FBYztRQUovQixZQUFPLEdBQWdDLElBQUksQ0FBQztRQVc1QyxrQkFBYSxHQUFHLEtBQUssRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQWlCLEVBQUUsRUFBRTtZQUMvRCxJQUFJLE1BQU0sS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFDO29CQUNILElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSwyQ0FBb0IsQ0FDckMsSUFBOEIsRUFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FDWixDQUFDO29CQUNGLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUMxRCxDQUFDO2dCQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7b0JBQ2hCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDeEMsQ0FBQztnQkFDRCxPQUFPO1lBQ1QsQ0FBQztZQUVELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLDZDQUE2QyxDQUFDLENBQUM7Z0JBQ3pFLE9BQU87WUFDVCxDQUFDO1lBRUQsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUM5QixJQUFJLENB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
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import type { AssetInfo, RendererResult, RendererSettings } from '@revideo/core/lib/app';
|
|
2
|
-
import type { PluginConfig } from '@revideo/vite-plugin/lib/plugins';
|
|
3
|
-
export declare function getCurrentVersion(): Promise<any>;
|
|
4
|
-
export interface FFmpegExporterSettings extends RendererSettings {
|
|
5
|
-
audio?: string;
|
|
6
|
-
audioOffset?: number;
|
|
7
|
-
fastStart: boolean;
|
|
8
|
-
includeAudio: boolean;
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* The server-side implementation of the FFmpeg video exporter.
|
|
12
|
-
*/
|
|
13
|
-
export declare class FFmpegExporterServer {
|
|
14
|
-
private readonly config;
|
|
15
|
-
private readonly stream;
|
|
16
|
-
private readonly command;
|
|
17
|
-
private readonly promise;
|
|
18
|
-
private readonly settings;
|
|
19
|
-
private readonly jobFolder;
|
|
20
|
-
private readonly audioFilenames;
|
|
21
|
-
constructor(settings: FFmpegExporterSettings, config: PluginConfig);
|
|
22
|
-
start(): Promise<void>;
|
|
23
|
-
handleFrame({ data }: {
|
|
24
|
-
data: string;
|
|
25
|
-
}): Promise<void>;
|
|
26
|
-
generateAudio({ assets, startFrame, endFrame, }: {
|
|
27
|
-
assets: AssetInfo[][];
|
|
28
|
-
startFrame: number;
|
|
29
|
-
endFrame: number;
|
|
30
|
-
}): Promise<void>;
|
|
31
|
-
mergeMedia(): Promise<void>;
|
|
32
|
-
private resolvePath;
|
|
33
|
-
end(result: RendererResult): Promise<void>;
|
|
34
|
-
kill(): Promise<void>;
|
|
35
|
-
private prepareAudio;
|
|
36
|
-
private mergeAudioTracks;
|
|
37
|
-
private calculateAtempoFilters;
|
|
38
|
-
}
|
|
39
|
-
//# sourceMappingURL=FFmpegExporterServer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FFmpegExporterServer.d.ts","sourceRoot":"","sources":["../../../server/ffmpeg/FFmpegExporterServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,gBAAgB,EACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,kCAAkC,CAAC;AAYnE,wBAAsB,iBAAiB,iBAatC;AAED,MAAM,WAAW,sBAAuB,SAAQ,gBAAgB;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;CACvB;AAcD;;GAEG;AACH,qBAAa,oBAAoB;IAU7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IATzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAW;gBAGxC,QAAQ,EAAE,sBAAsB,EACf,MAAM,EAAE,YAAY;IA0C1B,KAAK;IAYL,WAAW,CAAC,EAAC,IAAI,EAAC,EAAE;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC;IAKlC,aAAa,CAAC,EACzB,MAAM,EACN,UAAU,EACV,QAAQ,GACT,EAAE;QACD,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;KAClB;IAoBY,UAAU;IAoBvB,OAAO,CAAC,WAAW;IAcN,GAAG,CAAC,MAAM,EAAE,cAAc;IAc1B,IAAI;YAUH,YAAY;YAyDZ,gBAAgB;YAwBhB,sBAAsB;CA2BrC"}
|
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.FFmpegExporterServer = exports.getCurrentVersion = void 0;
|
|
4
|
-
const utils_1 = require("./utils");
|
|
5
|
-
const ffmpeg = require("fluent-ffmpeg");
|
|
6
|
-
const fs = require("fs");
|
|
7
|
-
const os = require("os");
|
|
8
|
-
const path = require("path");
|
|
9
|
-
const ImageStream_1 = require("./ImageStream");
|
|
10
|
-
const telemetry_1 = require("@revideo/telemetry");
|
|
11
|
-
const fsPromises = require("fs/promises");
|
|
12
|
-
const SAMPLE_RATE = 48000;
|
|
13
|
-
async function getCurrentVersion() {
|
|
14
|
-
try {
|
|
15
|
-
const packageData = JSON.parse(await fsPromises.readFile(path.join(__dirname, '..', '..', 'package.json'), 'utf-8'));
|
|
16
|
-
return packageData.version;
|
|
17
|
-
}
|
|
18
|
-
catch (e) {
|
|
19
|
-
return 'ERROR';
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
exports.getCurrentVersion = getCurrentVersion;
|
|
23
|
-
/**
|
|
24
|
-
* The server-side implementation of the FFmpeg video exporter.
|
|
25
|
-
*/
|
|
26
|
-
class FFmpegExporterServer {
|
|
27
|
-
constructor(settings, config) {
|
|
28
|
-
this.config = config;
|
|
29
|
-
this.settings = settings;
|
|
30
|
-
this.jobFolder = path.join(os.tmpdir(), `revideo-${this.settings.name}`);
|
|
31
|
-
console.log("this.jobFolder", this.jobFolder);
|
|
32
|
-
this.audioFilenames = [];
|
|
33
|
-
this.stream = new ImageStream_1.ImageStream();
|
|
34
|
-
this.command = ffmpeg();
|
|
35
|
-
// Input image sequence
|
|
36
|
-
this.command
|
|
37
|
-
.input(this.stream)
|
|
38
|
-
.inputFormat('image2pipe')
|
|
39
|
-
.inputFps(settings.fps);
|
|
40
|
-
// Input audio file
|
|
41
|
-
if (settings.includeAudio && settings.audio) {
|
|
42
|
-
this.command
|
|
43
|
-
.input(settings.audio.slice(1))
|
|
44
|
-
// FIXME Offset only works for negative values.
|
|
45
|
-
.inputOptions([`-itsoffset ${settings.audioOffset ?? 0}`]);
|
|
46
|
-
}
|
|
47
|
-
// Output settings
|
|
48
|
-
const size = {
|
|
49
|
-
x: Math.round(settings.size.x * settings.resolutionScale),
|
|
50
|
-
y: Math.round(settings.size.y * settings.resolutionScale),
|
|
51
|
-
};
|
|
52
|
-
this.command
|
|
53
|
-
.output(path.join(this.jobFolder, `visuals.mp4`))
|
|
54
|
-
.outputOptions(['-pix_fmt yuv420p', '-shortest'])
|
|
55
|
-
.outputFps(settings.fps)
|
|
56
|
-
.size(`${size.x}x${size.y}`);
|
|
57
|
-
if (settings.fastStart) {
|
|
58
|
-
this.command.outputOptions(['-movflags +faststart']);
|
|
59
|
-
}
|
|
60
|
-
this.promise = new Promise((resolve, reject) => {
|
|
61
|
-
this.command.on('end', resolve).on('error', reject);
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
async start() {
|
|
65
|
-
const version = await getCurrentVersion();
|
|
66
|
-
(0, telemetry_1.sendEvent)(telemetry_1.EventName.RenderStarted, { version });
|
|
67
|
-
if (!fs.existsSync(this.config.output)) {
|
|
68
|
-
await fs.promises.mkdir(this.config.output, { recursive: true });
|
|
69
|
-
}
|
|
70
|
-
if (!fs.existsSync(this.jobFolder)) {
|
|
71
|
-
await fs.promises.mkdir(this.jobFolder, { recursive: true });
|
|
72
|
-
}
|
|
73
|
-
this.command.run();
|
|
74
|
-
}
|
|
75
|
-
async handleFrame({ data }) {
|
|
76
|
-
const base64Data = data.slice(data.indexOf(',') + 1);
|
|
77
|
-
this.stream.pushImage(Buffer.from(base64Data, 'base64'));
|
|
78
|
-
}
|
|
79
|
-
async generateAudio({ assets, startFrame, endFrame, }) {
|
|
80
|
-
const assetPositions = getAssetPlacement(assets);
|
|
81
|
-
for (const asset of assetPositions) {
|
|
82
|
-
let hasAudioStream = true;
|
|
83
|
-
if (asset.type !== 'audio') {
|
|
84
|
-
hasAudioStream = await (0, utils_1.checkForAudioStream)(this.resolvePath(asset.src));
|
|
85
|
-
}
|
|
86
|
-
if (asset.playbackRate !== 0 && asset.volume !== 0 && hasAudioStream) {
|
|
87
|
-
const filename = await this.prepareAudio(asset, startFrame, endFrame);
|
|
88
|
-
this.audioFilenames.push(filename);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
if (this.audioFilenames.length > 0) {
|
|
92
|
-
await this.mergeAudioTracks();
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
async mergeMedia() {
|
|
96
|
-
if (this.audioFilenames.length > 0) {
|
|
97
|
-
await (0, utils_1.mergeAudioWithVideo)(path.join(this.jobFolder, `audio.wav`), path.join(this.jobFolder, `visuals.mp4`), path.join(this.config.output, `${this.settings.name}.mp4`));
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
const destination = path.join(this.config.output, `${this.settings.name}.mp4`);
|
|
101
|
-
await fs.promises.copyFile(path.join(this.jobFolder, `visuals.mp4`), destination);
|
|
102
|
-
console.log(`\nRendered successfully! Video saved to: ${destination}`);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
resolvePath(assetPath) {
|
|
106
|
-
let resolvedPath;
|
|
107
|
-
if (assetPath.startsWith('/@fs')) {
|
|
108
|
-
resolvedPath = assetPath.replace('/@fs', '');
|
|
109
|
-
}
|
|
110
|
-
else if (assetPath.startsWith('http')) {
|
|
111
|
-
resolvedPath = assetPath;
|
|
112
|
-
}
|
|
113
|
-
else if (assetPath.startsWith('/')) {
|
|
114
|
-
resolvedPath = path.join(this.config.output, '../public', assetPath);
|
|
115
|
-
}
|
|
116
|
-
else {
|
|
117
|
-
resolvedPath = path.join(this.config.output, '..', assetPath);
|
|
118
|
-
}
|
|
119
|
-
return resolvedPath;
|
|
120
|
-
}
|
|
121
|
-
async end(result) {
|
|
122
|
-
this.stream.pushImage(null);
|
|
123
|
-
if (result === 1) {
|
|
124
|
-
try {
|
|
125
|
-
this.command.kill('SIGKILL');
|
|
126
|
-
await this.promise;
|
|
127
|
-
}
|
|
128
|
-
catch (_) {
|
|
129
|
-
// do nothing
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
await this.promise;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
async kill() {
|
|
137
|
-
try {
|
|
138
|
-
//await fs.promises.rm(this.jobFolder, {recursive: true, force: true}); // cleanup
|
|
139
|
-
this.command.kill('SIGKILL');
|
|
140
|
-
await this.promise;
|
|
141
|
-
}
|
|
142
|
-
catch (_) {
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
async prepareAudio(asset, startFrame, endFrame) {
|
|
147
|
-
// Construct the output path
|
|
148
|
-
const sanitizedKey = asset.key.replace(/[/[\]]/g, '-');
|
|
149
|
-
const outputPath = path.join(this.jobFolder, `${sanitizedKey}.wav`);
|
|
150
|
-
const originalTrimLeft = asset.trimLeftInSeconds / asset.playbackRate;
|
|
151
|
-
const trimLeft = originalTrimLeft < 1 ? 0 : originalTrimLeft;
|
|
152
|
-
const trimRight = Math.min(trimLeft + asset.duration / this.settings.fps, trimLeft + (endFrame - startFrame + 1) / this.settings.fps);
|
|
153
|
-
const padStart = (asset.startInVideo / this.settings.fps) * 1000;
|
|
154
|
-
const assetSampleRate = await (0, utils_1.getSampleRate)(this.resolvePath(asset.src));
|
|
155
|
-
const padEnd = Math.max(0, (assetSampleRate * (endFrame - startFrame + 1)) / this.settings.fps -
|
|
156
|
-
(assetSampleRate * asset.duration) / this.settings.fps -
|
|
157
|
-
(assetSampleRate * padStart) / 1000);
|
|
158
|
-
const atempoFilters = await this.calculateAtempoFilters(asset.playbackRate); // atempo filter value must be >=0.5 and <=100. If the value is higher or lower, this function sets multiple atempo filters
|
|
159
|
-
const resolvedPath = this.resolvePath(asset.src);
|
|
160
|
-
await new Promise((resolve, reject) => {
|
|
161
|
-
const audioFilters = [
|
|
162
|
-
...atempoFilters,
|
|
163
|
-
`atrim=start=${trimLeft}:end=${trimRight}`,
|
|
164
|
-
`apad=pad_len=${padEnd}`,
|
|
165
|
-
`adelay=${padStart}|${padStart}|${padStart}`,
|
|
166
|
-
`volume=${asset.volume}`,
|
|
167
|
-
].join(',');
|
|
168
|
-
ffmpeg(resolvedPath)
|
|
169
|
-
.audioChannels(2)
|
|
170
|
-
.audioCodec('pcm_s16le')
|
|
171
|
-
.audioFrequency(SAMPLE_RATE)
|
|
172
|
-
.outputOptions([`-af`, audioFilters])
|
|
173
|
-
.on('end', () => {
|
|
174
|
-
resolve();
|
|
175
|
-
})
|
|
176
|
-
.on('error', err => {
|
|
177
|
-
console.error(`Error processing audio for asset key: ${asset.key}`, err);
|
|
178
|
-
reject(err);
|
|
179
|
-
})
|
|
180
|
-
.save(outputPath);
|
|
181
|
-
});
|
|
182
|
-
return outputPath;
|
|
183
|
-
}
|
|
184
|
-
async mergeAudioTracks() {
|
|
185
|
-
return new Promise((resolve, reject) => {
|
|
186
|
-
const command = ffmpeg();
|
|
187
|
-
this.audioFilenames.forEach(filename => {
|
|
188
|
-
command.input(filename);
|
|
189
|
-
});
|
|
190
|
-
command
|
|
191
|
-
.complexFilter([
|
|
192
|
-
`amix=inputs=${this.audioFilenames.length}:duration=longest`,
|
|
193
|
-
])
|
|
194
|
-
.outputOptions(['-c:a', 'pcm_s16le'])
|
|
195
|
-
.on('end', () => {
|
|
196
|
-
resolve();
|
|
197
|
-
})
|
|
198
|
-
.on('error', err => {
|
|
199
|
-
console.error(`Error merging audio tracks: ${err.message}`);
|
|
200
|
-
reject(err);
|
|
201
|
-
})
|
|
202
|
-
.save(path.join(this.jobFolder, `audio.wav`));
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
async calculateAtempoFilters(playbackRate) {
|
|
206
|
-
const atempoFilters = [];
|
|
207
|
-
// Calculate how many times we need to 100x the speed
|
|
208
|
-
let rate = playbackRate;
|
|
209
|
-
while (rate > 100.0) {
|
|
210
|
-
atempoFilters.push('atempo=100.0');
|
|
211
|
-
rate /= 100.0;
|
|
212
|
-
}
|
|
213
|
-
// Add the last atempo filter with the remaining rate
|
|
214
|
-
if (rate > 1.0) {
|
|
215
|
-
atempoFilters.push(`atempo=${rate}`);
|
|
216
|
-
}
|
|
217
|
-
// Calculate how many times we need to halve the speed
|
|
218
|
-
rate = playbackRate;
|
|
219
|
-
while (rate < 0.5) {
|
|
220
|
-
atempoFilters.push('atempo=0.5');
|
|
221
|
-
rate *= 2.0;
|
|
222
|
-
}
|
|
223
|
-
// Add the last atempo filter with the remaining rate
|
|
224
|
-
if (rate < 1.0) {
|
|
225
|
-
atempoFilters.push(`atempo=${rate}`);
|
|
226
|
-
}
|
|
227
|
-
return atempoFilters;
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
exports.FFmpegExporterServer = FFmpegExporterServer;
|
|
231
|
-
function getAssetPlacement(frames) {
|
|
232
|
-
const assets = [];
|
|
233
|
-
// A map to keep track of when each asset starts.
|
|
234
|
-
const assetStartMap = new Map();
|
|
235
|
-
for (let frame = 0; frame < frames.length; frame++) {
|
|
236
|
-
for (const asset of frames[frame]) {
|
|
237
|
-
if (!assetStartMap.has(asset.key)) {
|
|
238
|
-
assetStartMap.set(asset.key, frame);
|
|
239
|
-
assets.push({
|
|
240
|
-
key: asset.key,
|
|
241
|
-
src: asset.src,
|
|
242
|
-
type: asset.type,
|
|
243
|
-
startInVideo: frame,
|
|
244
|
-
endInVideo: frame,
|
|
245
|
-
duration: asset.duration,
|
|
246
|
-
playbackRate: asset.playbackRate,
|
|
247
|
-
volume: asset.volume,
|
|
248
|
-
trimLeftInSeconds: asset.currentTime,
|
|
249
|
-
});
|
|
250
|
-
}
|
|
251
|
-
else {
|
|
252
|
-
const existingAsset = assets.find(a => a.key === asset.key);
|
|
253
|
-
if (existingAsset) {
|
|
254
|
-
existingAsset.endInVideo = frame;
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
assets.forEach(asset => {
|
|
260
|
-
asset.duration = asset.endInVideo - asset.startInVideo + 1;
|
|
261
|
-
});
|
|
262
|
-
return assets;
|
|
263
|
-
}
|
|
264
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRkZtcGVnRXhwb3J0ZXJTZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zZXJ2ZXIvZmZtcGVnL0ZGbXBlZ0V4cG9ydGVyU2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQU1BLG1DQUFrRjtBQUNsRix3Q0FBd0M7QUFDeEMseUJBQXlCO0FBQ3pCLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0IsK0NBQTBDO0FBRTFDLGtEQUF3RDtBQUN4RCwwQ0FBMEM7QUFDMUMsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDO0FBRW5CLEtBQUssVUFBVSxpQkFBaUI7SUFDckMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDNUIsTUFBTSxVQUFVLENBQUMsUUFBUSxDQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLGNBQWMsQ0FBQyxFQUNoRCxPQUFPLENBQ1IsQ0FDRixDQUFDO1FBRUYsT0FBTyxXQUFXLENBQUMsT0FBTyxDQUFDO0lBQzdCLENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1gsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztBQUNILENBQUM7QUFiRCw4Q0FhQztBQXFCRDs7R0FFRztBQUNILE1BQWEsb0JBQW9CO0lBUS9CLFlBQ0UsUUFBZ0MsRUFDZixNQUFvQjtRQUFwQixXQUFNLEdBQU4sTUFBTSxDQUFjO1FBRXJDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsV0FBVyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDekUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUMsSUFB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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FFmpegPlugin.d.ts","sourceRoot":"","sources":["../../../server/ffmpeg/FFmpegPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,MAAM,EAGP,MAAM,kCAAkC,CAAC;AAG5C,wBAAgB,YAAY,IAAI,MAAM,CAcrC"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ffmpegPlugin = void 0;
|
|
4
|
-
const plugins_1 = require("@revideo/vite-plugin/lib/plugins");
|
|
5
|
-
const FFmpegBridge_1 = require("./FFmpegBridge");
|
|
6
|
-
function ffmpegPlugin() {
|
|
7
|
-
let config;
|
|
8
|
-
return {
|
|
9
|
-
name: 'revideo/ffmpeg',
|
|
10
|
-
[plugins_1.PLUGIN_OPTIONS]: {
|
|
11
|
-
entryPoint: '@revideo/renderer/lib/client',
|
|
12
|
-
async config(value) {
|
|
13
|
-
config = value;
|
|
14
|
-
},
|
|
15
|
-
},
|
|
16
|
-
configureServer(server) {
|
|
17
|
-
new FFmpegBridge_1.FFmpegBridge(server.ws, config);
|
|
18
|
-
},
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
exports.ffmpegPlugin = ffmpegPlugin;
|
|
22
|
-
;
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRkZtcGVnUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc2VydmVyL2ZmbXBlZy9GRm1wZWdQbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsOERBSTRDO0FBQzVDLGlEQUE0QztBQUU1QyxTQUFnQixZQUFZO0lBQ3hCLElBQUksTUFBb0IsQ0FBQztJQUN6QixPQUFPO1FBQ0gsSUFBSSxFQUFFLGdCQUFnQjtRQUN0QixDQUFDLHdCQUFjLENBQUMsRUFBRTtZQUNsQixVQUFVLEVBQUUsOEJBQThCO1lBQzFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSztnQkFDZCxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ25CLENBQUM7U0FDQTtRQUNELGVBQWUsQ0FBQyxNQUFNO1lBQ3RCLElBQUksMkJBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLENBQUM7S0FDSixDQUFDO0FBQ04sQ0FBQztBQWRELG9DQWNDO0FBQUEsQ0FBQyJ9
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
/// <reference types="node" />
|
|
3
|
-
import { Readable } from 'stream';
|
|
4
|
-
export declare class ImageStream extends Readable {
|
|
5
|
-
private image;
|
|
6
|
-
private hasData;
|
|
7
|
-
pushImage(image: Buffer | null): void;
|
|
8
|
-
_read(): void;
|
|
9
|
-
}
|
|
10
|
-
//# sourceMappingURL=ImageStream.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ImageStream.d.ts","sourceRoot":"","sources":["../../../server/ffmpeg/ImageStream.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,QAAQ,CAAC;AAEhC,qBAAa,WAAY,SAAQ,QAAQ;IACvC,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,OAAO,CAAS;IAEjB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAOrB,KAAK;CAMtB"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ImageStream = void 0;
|
|
4
|
-
const stream_1 = require("stream");
|
|
5
|
-
class ImageStream extends stream_1.Readable {
|
|
6
|
-
constructor() {
|
|
7
|
-
super(...arguments);
|
|
8
|
-
this.image = null;
|
|
9
|
-
this.hasData = false;
|
|
10
|
-
}
|
|
11
|
-
pushImage(image) {
|
|
12
|
-
this.image = image;
|
|
13
|
-
this.hasData = true;
|
|
14
|
-
this._read();
|
|
15
|
-
}
|
|
16
|
-
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
17
|
-
_read() {
|
|
18
|
-
if (this.hasData) {
|
|
19
|
-
this.hasData = false;
|
|
20
|
-
this.push(this.image);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
exports.ImageStream = ImageStream;
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW1hZ2VTdHJlYW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zZXJ2ZXIvZmZtcGVnL0ltYWdlU3RyZWFtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFnQztBQUVoQyxNQUFhLFdBQVksU0FBUSxpQkFBUTtJQUF6Qzs7UUFDVSxVQUFLLEdBQWtCLElBQUksQ0FBQztRQUM1QixZQUFPLEdBQUcsS0FBSyxDQUFDO0lBZTFCLENBQUM7SUFiUSxTQUFTLENBQUMsS0FBb0I7UUFDbkMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2YsQ0FBQztJQUVELGdFQUFnRTtJQUNoRCxLQUFLO1FBQ25CLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFqQkQsa0NBaUJDIn0=
|