@visactor/vmind
Version:
<div align="center"> <a href="https://github.com/VisActor#gh-light-mode-only" target="_blank"> <img alt="VisActor Logo" width="200" src="https://github.com/VisActor/.github/blob/main/profile/logo_500_200_light.svg"/> </a> <a href="https://githu
97 lines (94 loc) • 4.36 kB
JavaScript
var __awaiter = this && this.__awaiter || function(thisArg, _arguments, P, generator) {
return new (P || (P = Promise))((function(resolve, reject) {
function fulfilled(value) {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
}
function rejected(value) {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
}
function step(result) {
var value;
result.done ? resolve(result.value) : (value = result.value, value instanceof P ? value : new P((function(resolve) {
resolve(value);
}))).then(fulfilled, rejected);
}
step((generator = generator.apply(thisArg, _arguments || [])).next());
}));
};
import { cloneDeep } from "@visactor/vutils";
let idx = 0;
export function _chatToVideoWasm(fps, propsSpec, propsTime, outName = "out", outerPackages, mode) {
var _a, _b;
return __awaiter(this, void 0, void 0, (function*() {
const {ManualTicker: ManualTicker, defaultTimeline: defaultTimeline, VChart: VChart, fetchFile: fetchFile, FFmpeg: FFmpeg, createCanvas: createCanvas} = outerPackages;
idx++;
const defaultTicker = new ManualTicker, spec = cloneDeep(propsSpec), time = cloneDeep(propsTime), {totalTime: totalTime, frameArr: frameArr} = time, width = null !== (_a = spec.width) && void 0 !== _a ? _a : 720, height = null !== (_b = spec.height) && void 0 !== _b ? _b : 480;
spec.width = width, spec.height = height, frameArr && frameArr.length && spec.player && (spec.player.auto = !1),
defaultTicker.mode = "manual";
const canvas = createCanvas(width, height), vchart = new VChart(spec, {
renderCanvas: canvas,
mode: "node",
dpr: 1,
disableDirtyBounds: !0,
ticker: defaultTicker,
options3d: {
enable: !0,
alpha: 0,
beta: 0,
center: {
x: 1030,
y: 300
},
fieldRatio: .8,
light: {
dir: [ 3, -2, -1 ],
color: "white",
ambient: .7
}
}
}), stage = vchart.getStage();
stage.ticker = defaultTicker, stage.ticker.addTimeline(defaultTimeline), yield vchart.renderAsync();
const frame = totalTime / 1e3 * fps + 1, player = vchart.getComponents().filter((d => "player" === d.type))[0], shouldControlPlayer = player && frameArr && frameArr.length, t = 1e3 / fps;
let nextFrameTime = 0;
shouldControlPlayer && (nextFrameTime = frameArr.shift());
for (let i = 0; i <= frame; i++) {
shouldControlPlayer && t * i > nextFrameTime && (nextFrameTime += frameArr.shift() || 0,
player._playerComponent.forward()), defaultTicker.tickTo(t * i), vchart.getStage().render();
const num = `0000${i}`.slice(-3);
if ("node" === mode) {
const buffer = canvas.toBuffer();
FFmpeg.FS("writeFile", `vchart${idx}.${num}.png`, buffer);
} else {
const size = {
width: canvas.width,
height: canvas.height
}, blob = yield new Promise(((resolve, reject) => {
canvas.toBlob((blob => {
if (blob) {
resolve({
data: blob,
format: "PNG",
size: size
});
} else reject("no blob");
}), "image/png");
}));
FFmpeg.FS("writeFile", `vchart${idx}.${num}.png`, yield fetchFile(blob.data));
}
}
vchart.release(), yield FFmpeg.run("-framerate", "30", "-pattern_type", "glob", "-i", "*.png", "-c:v", "libx264", "-pix_fmt", "yuv420p", `${outName}.mp4`);
for (let i = 0; i <= frame; i++) {
const num = `0000${i}`.slice(-3);
FFmpeg.FS("unlink", `vchart${idx}.${num}.png`);
}
}));
}
//# sourceMappingURL=video.js.map