I am trying to concat multiple videos of different extensions with ffmpeg-fluent
npm package but I am not getting output. I shared my code below.
const express = require("express");
const multer = require("multer");
const fluent_ffmpeg = require("fluent-ffmpeg");
const mergedVideo = fluent_ffmpeg();
const app = express();
const fs = require("fs");
const path = require("path");
const ffmpeg = require('@ffmpeg-installer/ffmpeg').path;
const ffprobe = require('@ffprobe-installer/ffprobe').path;
mergedVideo.setFfmpegPath(ffmpeg);
mergedVideo.setFfprobePath(ffprobe);
const PORT = process.env.PORT || 3000;
var dir = "public";
var subDirectory = "public/uploads";
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname,"public")));
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir);
fs.mkdirSync(subDirectory);
}
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, "public/uploads");
},
filename: function (req, file, cb) {
cb(
null,
file.fieldname + "-" + Date.now() + path.extname(file.originalname)
);
}
});
var upload = multer({ storage: storage });
app.post('/merge',upload.any(),(req,res) => {
let file_list = [];
let str_command = "";
req.files.forEach((element)=>{
//file_list.push("-i "+"./"+element.path);
file_list.push("./"+element.path);
});
for(let i = 0;i<file_list.length;i++){
str_command +=`[${i}:v][${i}:a]`;
}
filter_option = `${str_command} concat=n=${file_list.length}:v=1:a=1 [outv] [outa]`;
output_option = ['-map [outv]','-map [outa]'];
let chainedInputs = file_list.reduce((result, inputItem) => result.addInput(inputItem), mergedVideo);
chainedInputs
.complexFilter([filter_option])
.outputOption(output_option)
.on('error', function(err) {
console.log("Error:",err.message);
})
.on('start', function() {
console.log('Merging...');
})
.on('progress', function(progress) {
// Progress goes here
console.log(progress);
})
.on('end', function() {
console.log(output_file + ' merged.');
})
.save('output.mp4');
});
app.get("/", (req, res) => {
res.sendFile(__dirname + "/index.html");
});
app.listen(PORT, () => {
console.log(`App is listening on Port ${PORT}`);
});
The error I am getting in Terminal :
App is listening on Port 3000
Merging...
Error: ffmpeg exited with code 1: Error reinitializing filters!
Failed to inject frame into filter network: Invalid argument
Error while processing the decoded data for stream #2:0
Conversion failed!
Here is my folder structure: