29 lines
1,004 B
JavaScript
29 lines
1,004 B
JavaScript
|
const { generateAudio } = require("./shitpost-audio.js");
|
||
|
const { generateFrames } = require("./shitpost-video.js");
|
||
|
const { spawn } = require("child_process");
|
||
|
const fs = require("fs");
|
||
|
|
||
|
async function generateVideo (sourceImg, duration)
|
||
|
{
|
||
|
let [framesPath, audioPath] = await Promise.all([
|
||
|
generateFrames(sourceImg, duration),
|
||
|
generateAudio(duration)
|
||
|
]);
|
||
|
|
||
|
const outputPath = `./temp/output_${Math.floor(Math.random() * 10000).toString().padStart(4, "0")}.mp4`;
|
||
|
|
||
|
const child = spawn(`ffmpeg -i ${audioPath} -r 20 -i ${framesPath}/%d.png -c:v libx264 -vf fps=20 -pix_fmt yuv420p ${outputPath}`, { shell: true })
|
||
|
child.on("exit", (code) => { finished = true; });
|
||
|
|
||
|
let finished = false;
|
||
|
while (!finished) await new Promise(resolve => setTimeout(resolve, 10));
|
||
|
|
||
|
// delete temp files
|
||
|
fs.promises.rm(framesPath, { recursive: true });
|
||
|
fs.promises.rm(audioPath);
|
||
|
fs.promises.rm(sourceImg);
|
||
|
|
||
|
return outputPath;
|
||
|
}
|
||
|
|
||
|
module.exports = { generateVideo };
|