const ffmpeg = require('fluent-ffmpeg');
const fs = require('fs');
const path = require('path');
function createClipFromImage(imagePath, duration, outputClipPath, callback) {
ffmpeg(imagePath)
.inputOptions('-loop 1')
.inputOptions(`-t ${duration}`)
.videoFilter('scale=800:600')
.inputOptions('-framerate 1')
.outputOptions([
'-c:v libx264',
'-pix_fmt yuv420p',
'-crf 23',
'-preset veryfast'
])
.output(outputClipPath)
.on('end', () => {
console.log(`Clip created: ${outputClipPath}`);
callback(null, outputClipPath);
})
.on('error', (err) => {
console.error(`Error: ${err.message}`);
callback(err);
})
.run();
}
function concatenateClips(clips, outputPath, callback) {
const fileList = 'filelist.txt';
const fileContent = clips.map(clip => `file '${clip}'`).join('\n');
fs.writeFileSync(fileList, fileContent);
console.log("created")
console.log("clips.map =="+ clips.length)
console.log("fileContent=="+ fileContent)
ffmpeg()
.input(fileList)
.inputOptions(['-f concat', '-safe 0'])
.outputOptions('-c copy')
.output(outputPath)
.on('end', () => {
console.log('Final video created successfully');
callback(null);
})
.on('error', (err) => {
console.error(`Error: ${err.message}`);
callback(err);
})
.run();
}
function createVideo(screenshots, durations, outputPath) {
let clips = [];
let finishCount = 0;
for (let index = 0; index < screenshots.length; index++) {
const screenshot = screenshots[index];
const duration = durations[index];
const clipPath = `clip${index}.mp4`;
createClipFromImage(screenshot, duration, clipPath, (err, clip) => {
finishCount++;
if (err) {
console.error(`Failed to create clip for ${screenshot}: ${err}`);
return;
}
clips.push(clip);
if (finishCount === screenshots.length) {
concatenateClips(clips, outputPath, (err) => {
if (err) {
console.error(`Failed to concatenate clips: ${err}`);
return;
}
console.log('All done');
});
}
});
}
}
const screenshots = [
path.join(__dirname, 'images/image1.jpg'),
path.join(__dirname, 'images/image2.jpg')
];
const durations = [5, 10];
const outputPath = path.join(__dirname, 'videos/output.mp4');
createVideo(screenshots, durations, outputPath);