|
|
|
|
|
// 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}`);
|
|
|
|
|
|
});
|