I've written below code which(is triggered when a video is uploaded to s3) gets an image from s3, resizes it with fleunt-ffmpeg nodejs module and then uploads it to s3 bucket.
async.waterfall([
function download(next) {
// Download video
s3.getObject({
Bucket: srcBucket,
Key: srcKey
}, next);
},
function resizeBuffer(response, next) {
// Resize
resizeVideo(response, function (err, response, buffer){
if(err){
console.log(err);
return next(err);
}
next(null, response, buffer);
});
},
function uploadBuffer(response, buffer, next) {
// Upload to s3
let resizedImageName = "resized/" + imageName;
s3.putObject({
Bucket: srcBucket,
Key: resizedImageName,
Body: buffer,
ContentType: response.ContentType
}, function(err, data) {
if (err) {
console.log(err, err.stack);
}else{
console.log('image resized----------------------->');
next(null, response, buffer);
}
});
}
], function (err) {
if (err) {
console.log('Unable to resize image.');
} else {
console.log('Successfully resized image.');
}
callback(null, "done--------------->");
});
function resizeVideo(response, callback){
try {
let command = ffmpeg(response.Body);
console.log('1-------------->');
command.size('50%');
console.log('2-------------->');
callback(null, response, command.pipe());
} catch (e) {
console.log('video resize error------------------------->');
console.log(e);
callback('Video resize error')
}
}
This code works fine for images(imagemagik instead of fluent-ffmpeg) but shows error when I use ffmpeg : Error: Stream yields empty buffer