You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

60 lines
1.5 KiB

// alternate.js
const fs = require("fs");
const path = require("path");
const { spawn } = require("child_process");
// Ensure output folder exists
if (!fs.existsSync("output")) fs.mkdirSync("output");
// Step 1: Search for files
const inputDir = "inputs";
const files = fs.readdirSync(inputDir);
const audioFile = files.find(f => f.toLowerCase().endsWith(".wav"));
const imageFile = files.find(f => f.toLowerCase().match(/\.(jpg|jpeg|svg)$/));
if (!audioFile || !imageFile) {
console.error("❌ Missing .wav and/or .jpg/.svg file in inputs/");
process.exit(1);
}
const audioPath = path.join(inputDir, audioFile);
const imagePath = path.join(inputDir, imageFile);
const outputName = `output-${Date.now()}.mp4`;
const outputPath = path.join("output", outputName);
// Step 2: Convert using ffmpeg (no duration check)
console.log(`🎧 Found: ${audioFile}`);
console.log(`🖼 Found: ${imageFile}`);
console.log(`🚀 Starting conversion → ${outputName}`);
const args = [
"-loop", "1",
"-i", imagePath,
"-i", audioPath,
"-c:v", "libx264",
"-preset", "ultrafast",
"-tune", "stillimage",
"-crf", "23",
"-c:a", "aac",
"-shortest",
"-pix_fmt", "yuv420p",
"-movflags", "+faststart",
outputPath
];
const ffmpeg = spawn("ffmpeg", args);
ffmpeg.stderr.on("data", (data) => {
console.log(data.toString().trim()); // log raw ffmpeg output
});
ffmpeg.on("exit", (code) => {
if (code !== 0) {
console.error(`❌ FFmpeg exited with code ${code}`);
return;
}
console.log(`✅ Conversion complete! Saved to: ${outputPath}`);
});