@revideo/renderer 0.3.7-alpha.975 → 0.3.7-beta.987

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.
Files changed (46) hide show
  1. package/lib/client/FFmpegExporterClient.d.ts +46 -0
  2. package/lib/client/FFmpegExporterClient.d.ts.map +1 -0
  3. package/lib/client/FFmpegExporterClient.js +118 -0
  4. package/lib/client/ffpmeg.d.ts +3 -0
  5. package/lib/client/ffpmeg.d.ts.map +1 -0
  6. package/lib/client/ffpmeg.js +9 -0
  7. package/lib/client/index.d.ts +3 -0
  8. package/lib/client/index.d.ts.map +1 -0
  9. package/lib/client/index.js +9 -0
  10. package/lib/index.js +5 -0
  11. package/lib/index.js.map +1 -0
  12. package/lib/server/RendererPlugin.d.ts +3 -0
  13. package/lib/server/RendererPlugin.d.ts.map +1 -0
  14. package/lib/server/RendererPlugin.js +50 -0
  15. package/lib/server/ffmpeg/FFmpegBridge.d.ts +22 -0
  16. package/lib/server/ffmpeg/FFmpegBridge.d.ts.map +1 -0
  17. package/lib/server/ffmpeg/FFmpegBridge.js +92 -0
  18. package/lib/server/ffmpeg/FFmpegExporterServer.d.ts +39 -0
  19. package/lib/server/ffmpeg/FFmpegExporterServer.d.ts.map +1 -0
  20. package/lib/server/ffmpeg/FFmpegExporterServer.js +264 -0
  21. package/lib/server/ffmpeg/FFmpegPlugin.d.ts +3 -0
  22. package/lib/server/ffmpeg/FFmpegPlugin.d.ts.map +1 -0
  23. package/lib/server/ffmpeg/FFmpegPlugin.js +23 -0
  24. package/lib/server/ffmpeg/ImageStream.d.ts +10 -0
  25. package/lib/server/ffmpeg/ImageStream.d.ts.map +1 -0
  26. package/lib/server/ffmpeg/ImageStream.js +25 -0
  27. package/lib/server/ffmpeg/VideoFrameExtractor.d.ts +41 -0
  28. package/lib/server/ffmpeg/VideoFrameExtractor.d.ts.map +1 -0
  29. package/lib/server/ffmpeg/VideoFrameExtractor.js +148 -0
  30. package/lib/server/ffmpeg/utils.d.ts +8 -0
  31. package/lib/server/ffmpeg/utils.d.ts.map +1 -0
  32. package/lib/server/ffmpeg/utils.js +141 -0
  33. package/lib/server/render-video.d.ts +32 -9
  34. package/lib/server/render-video.d.ts.map +1 -1
  35. package/lib/server/render-video.js +66 -57
  36. package/lib/server/renderVideo.d.ts +10 -0
  37. package/lib/server/renderVideo.d.ts.map +1 -0
  38. package/lib/server/renderVideo.js +124 -0
  39. package/lib/server/renderer-plugin.d.ts +1 -1
  40. package/lib/server/renderer-plugin.d.ts.map +1 -1
  41. package/lib/server/renderer-plugin.js +4 -4
  42. package/lib/server/tsconfig.tsbuildinfo +1 -1
  43. package/lib/server/utils.d.ts +3 -0
  44. package/lib/server/utils.d.ts.map +1 -0
  45. package/lib/server/utils.js +20 -0
  46. package/package.json +4 -4
@@ -0,0 +1,46 @@
1
+ import type { AssetInfo, MetaField, Project, RendererResult, RendererSettings } from '@revideo/core';
2
+ import { Exporter } from '@revideo/core';
3
+ /**
4
+ * FFmpeg video exporter.
5
+ *
6
+ * @remarks
7
+ * Most of the export logic is handled on the server. This class communicates
8
+ * with the FFmpegBridge through a WebSocket connection which lets it invoke
9
+ * methods on the FFmpegExporterServer class.
10
+ *
11
+ * For example, calling the following method:
12
+ * ```ts
13
+ * async this.invoke('process', 7);
14
+ * ```
15
+ * Will invoke the `process` method on the FFmpegExporterServer class with `7`
16
+ * as the argument. The result of the method will be returned as a Promise.
17
+ *
18
+ * Before any methods can be invoked, the FFmpegExporterServer class must be
19
+ * initialized by invoking `start`.
20
+ */
21
+ export declare class FFmpegExporterClient implements Exporter {
22
+ private readonly project;
23
+ private readonly settings;
24
+ static readonly id = "@revideo/renderer/ffmpeg";
25
+ static readonly displayName = "Video (FFmpeg)";
26
+ static meta(project: Project): MetaField<any>;
27
+ static create(project: Project, settings: RendererSettings): Promise<FFmpegExporterClient>;
28
+ private static readonly response;
29
+ constructor(project: Project, settings: RendererSettings);
30
+ start(): Promise<void>;
31
+ handleFrame(canvas: HTMLCanvasElement): Promise<void>;
32
+ private blobToDataUrl;
33
+ stop(result: RendererResult): Promise<void>;
34
+ kill(): Promise<void>;
35
+ generateAudio(assets: AssetInfo[][], startFrame: number, endFrame: number): Promise<void>;
36
+ mergeMedia(): Promise<void>;
37
+ /**
38
+ * Remotely invoke a method on the server and wait for a response.
39
+ *
40
+ * @param method - The method name to execute on the server.
41
+ * @param data - The data that will be passed as an argument to the method.
42
+ * Should be serializable.
43
+ */
44
+ private invoke;
45
+ }
46
+ //# sourceMappingURL=FFmpegExporterClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FFmpegExporterClient.d.ts","sourceRoot":"","sources":["../../client/FFmpegExporterClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,SAAS,EACT,OAAO,EACP,cAAc,EACd,gBAAgB,EACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAGL,QAAQ,EAGT,MAAM,eAAe,CAAC;AAkBvB;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,oBAAqB,YAAW,QAAQ;IA6BjD,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IA7B3B,gBAAuB,EAAE,8BAA8B;IACvD,gBAAuB,WAAW,oBAAoB;WAExC,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC;WAShC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB;IAIvE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAyC;gBAYtD,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,gBAAgB;IAGhC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAWtB,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;YAepD,aAAa;IASd,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,aAAa,CACxB,MAAM,EAAE,SAAS,EAAE,EAAE,EACrB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC;IAIH,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxC;;;;;;OAMG;IACH,OAAO,CAAC,MAAM;CA6Bf"}
@@ -0,0 +1,118 @@
1
+ var _a;
2
+ import { BoolMetaField, EventDispatcher, ObjectMetaField, } from '@revideo/core';
3
+ /**
4
+ * FFmpeg video exporter.
5
+ *
6
+ * @remarks
7
+ * Most of the export logic is handled on the server. This class communicates
8
+ * with the FFmpegBridge through a WebSocket connection which lets it invoke
9
+ * methods on the FFmpegExporterServer class.
10
+ *
11
+ * For example, calling the following method:
12
+ * ```ts
13
+ * async this.invoke('process', 7);
14
+ * ```
15
+ * Will invoke the `process` method on the FFmpegExporterServer class with `7`
16
+ * as the argument. The result of the method will be returned as a Promise.
17
+ *
18
+ * Before any methods can be invoked, the FFmpegExporterServer class must be
19
+ * initialized by invoking `start`.
20
+ */
21
+ export class FFmpegExporterClient {
22
+ static meta(project) {
23
+ return new ObjectMetaField(this.displayName, {
24
+ fastStart: new BoolMetaField('fast start', true),
25
+ includeAudio: new BoolMetaField('include audio', true).disable(!project.audio),
26
+ });
27
+ }
28
+ static async create(project, settings) {
29
+ return new _a(project, settings);
30
+ }
31
+ constructor(project, settings) {
32
+ this.project = project;
33
+ this.settings = settings;
34
+ }
35
+ async start() {
36
+ const options = this.settings.exporter.options;
37
+ await this.invoke('start', {
38
+ ...this.settings,
39
+ ...options,
40
+ audio: this.project.audio,
41
+ audioOffset: this.project.meta.shared.audioOffset.get() - this.settings.range[0],
42
+ });
43
+ }
44
+ async handleFrame(canvas) {
45
+ const blob = await new Promise(resolve => canvas.toBlob(resolve, 'image/jpeg'));
46
+ if (!blob) {
47
+ throw Error('Failed to convert canvas to Blob.');
48
+ }
49
+ const dataUrl = await this.blobToDataUrl(blob);
50
+ await this.invoke('handleFrame', {
51
+ data: dataUrl,
52
+ });
53
+ }
54
+ async blobToDataUrl(blob) {
55
+ return new Promise((resolve, reject) => {
56
+ const reader = new FileReader();
57
+ reader.onloadend = () => resolve(reader.result);
58
+ reader.onerror = reject;
59
+ reader.readAsDataURL(blob);
60
+ });
61
+ }
62
+ async stop(result) {
63
+ await this.invoke('end', result);
64
+ }
65
+ async kill() {
66
+ await this.invoke('kill', {});
67
+ }
68
+ async generateAudio(assets, startFrame, endFrame) {
69
+ await this.invoke('generateAudio', { assets, startFrame, endFrame });
70
+ }
71
+ async mergeMedia() {
72
+ await this.invoke('mergeMedia', {});
73
+ }
74
+ /**
75
+ * Remotely invoke a method on the server and wait for a response.
76
+ *
77
+ * @param method - The method name to execute on the server.
78
+ * @param data - The data that will be passed as an argument to the method.
79
+ * Should be serializable.
80
+ */
81
+ invoke(method, data) {
82
+ if (import.meta.hot) {
83
+ return new Promise((resolve, reject) => {
84
+ const handle = (response) => {
85
+ if (response.method !== method) {
86
+ return;
87
+ }
88
+ _a.response.unsubscribe(handle);
89
+ if (response.status === 'success') {
90
+ resolve(response.data);
91
+ }
92
+ else {
93
+ reject({
94
+ message: `An error occurred while exporting the video: ${response.message}`,
95
+ remarks: `Method: ${method}<br>Server error: ${response.message}`,
96
+ object: data,
97
+ });
98
+ }
99
+ };
100
+ _a.response.subscribe(handle);
101
+ import.meta.hot.send('revideo:ffmpeg-exporter', { method, data });
102
+ });
103
+ }
104
+ else {
105
+ throw new Error('FFmpegExporter can only be used locally.');
106
+ }
107
+ }
108
+ }
109
+ _a = FFmpegExporterClient;
110
+ FFmpegExporterClient.id = '@revideo/renderer/ffmpeg';
111
+ FFmpegExporterClient.displayName = 'Video (FFmpeg)';
112
+ FFmpegExporterClient.response = new EventDispatcher();
113
+ (() => {
114
+ if (import.meta.hot) {
115
+ import.meta.hot.on(`revideo:ffmpeg-exporter-ack`, (response) => _a.response.dispatch(response));
116
+ }
117
+ })();
118
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRkZtcGVnRXhwb3J0ZXJDbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9jbGllbnQvRkZtcGVnRXhwb3J0ZXJDbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQU9BLE9BQU8sRUFDTCxhQUFhLEVBQ2IsZUFBZSxFQUVmLGVBQWUsR0FFaEIsTUFBTSxlQUFlLENBQUM7QUFrQnZCOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sT0FBTyxvQkFBb0I7SUFJeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFnQjtRQUNqQyxPQUFPLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDM0MsU0FBUyxFQUFFLElBQUksYUFBYSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUM7WUFDaEQsWUFBWSxFQUFFLElBQUksYUFBYSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQzVELENBQUMsT0FBTyxDQUFDLEtBQUssQ0FDZjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFnQixFQUFFLFFBQTBCO1FBQ3JFLE9BQU8sSUFBSSxFQUFvQixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBYUQsWUFDbUIsT0FBZ0IsRUFDaEIsUUFBMEI7UUFEMUIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUNoQixhQUFRLEdBQVIsUUFBUSxDQUFrQjtJQUMxQyxDQUFDO0lBRUcsS0FBSyxDQUFDLEtBQUs7UUFDaEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBZ0MsQ0FBQztRQUN4RSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ3pCLEdBQUcsSUFBSSxDQUFDLFFBQVE7WUFDaEIsR0FBRyxPQUFPO1lBQ1YsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENB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
@@ -0,0 +1,3 @@
1
+ declare const _default: () => import("@revideo/core").Plugin;
2
+ export default _default;
3
+ //# sourceMappingURL=ffpmeg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ffpmeg.d.ts","sourceRoot":"","sources":["../../client/ffpmeg.ts"],"names":[],"mappings":";AAIA,wBAKG"}
@@ -0,0 +1,9 @@
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=
@@ -0,0 +1,3 @@
1
+ declare const _default: () => import("@revideo/core").Plugin;
2
+ export default _default;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../client/index.ts"],"names":[],"mappings":";AAIA,wBAKG"}
@@ -0,0 +1,9 @@
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 ADDED
@@ -0,0 +1,5 @@
1
+ Object.defineProperty(exports, '__esModule', {value: !0});
2
+ const e = require('tslib');
3
+ e.__exportStar(require('./main'), exports),
4
+ e.__exportStar(require('./plugin'), exports);
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,3 @@
1
+ import { Plugin } from 'vite';
2
+ export declare function rendererPlugin(params?: Record<string, unknown>): Plugin;
3
+ //# sourceMappingURL=RendererPlugin.d.ts.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,50 @@
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=
@@ -0,0 +1,22 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,92 @@
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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
@@ -0,0 +1,39 @@
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
@@ -0,0 +1 @@
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"}