motion-canvas-multitrack
Version:
A plug and play audio plugin for Motion Canvas
79 lines • 2.99 kB
JavaScript
import { BoolMetaField, ObjectMetaField } from '@motion-canvas/core/lib/meta';
import { EventDispatcher } from '@motion-canvas/core/lib/events';
export class MultiExport {
project;
settings;
static id = 'multitrack';
static displayName = 'MultiTrack';
static meta(project) {
return new ObjectMetaField(this.displayName, {
fastStart: new BoolMetaField('fast start', true),
includeAudio: new BoolMetaField('include audio', true).disable(!project.audio),
});
}
static async create(project, settings) {
return new MultiExport(project, settings);
}
static response = new EventDispatcher();
static {
if (import.meta.hot) {
import.meta.hot.on(`motion-canvas/ffmpeg-ack`, (response) => this.response.dispatch(response));
}
}
constructor(project, settings) {
this.project = project;
this.settings = settings;
}
async start() {
const options = this.settings.exporter.options;
document.addEventListener("multi-track:finalize", (e) => start_invoke());
document.dispatchEvent(new CustomEvent("multi-track:prepare"));
const start_invoke = async () => {
await this.invoke('start', {
...this.settings,
...options,
audio: "/audio/multi-track-audio.wav",
audioOffset: this.project.meta.shared.audioOffset.get() - this.settings.range[0],
});
};
}
async handleFrame(canvas) {
await this.invoke('handleFrame', {
data: canvas.toDataURL('image/png'),
});
}
async stop(result) {
await this.invoke('end', result);
}
invoke(method, data) {
if (import.meta.hot) {
return new Promise((resolve, reject) => {
const handle = (response) => {
if (response.method == "end") {
fetch("cleanup"); // remove file "/audio/multi-track-audio.wav"
}
if (response.method !== method) {
return;
}
MultiExport.response.unsubscribe(handle);
if (response.status === 'success') {
resolve(response.data);
}
else {
reject({
message: 'An error occurred while exporting the video.',
remarks: `Method: ${method}<br>Server error: ${response.message}`,
object: data,
});
}
};
MultiExport.response.subscribe(handle);
import.meta.hot.send('motion-canvas/ffmpeg', { method, data });
});
}
else {
throw new Error('MultiExport can only be used locally.');
}
}
}
//# sourceMappingURL=export.js.map