synopsis-video
Version:
Create Video Synopsis from provided videos. Frames are extracted from each video provided and backgrounds are subtracted around moving elements and merged into a single video for quick review.
57 lines (55 loc) • 2.03 kB
JavaScript
const {
rawDirectory,
mergedFramesDirectory,
firstFrameDirectory,
stripNamePng,
createBaseFolder,
} = require('./utils.js');
const fs = require('fs');
const gm = require('gm').subClass({imageMagick: true})
exports.mergeFramePairs = (rawDirectory,videoNames) => {
const response = {
startedAt: new Date(),
videoNames: videoNames,
numberOfVideos: videoNames.length,
numberOfFrames: 0,
}
return new Promise((resolve,reject) => {
var backgroundPath = firstFrameDirectory + fs.readdirSync(firstFrameDirectory)[0]
var videoImages = {}
var videoImagePairs = []
videoNames.forEach((videoName) => {
const videoFolder = rawDirectory + videoName + '/'
videoImages[videoName] = fs.readdirSync(videoFolder)
videoImages[videoName].forEach((filename) => {
const n = stripNamePng(filename)
if(!videoImagePairs[n])videoImagePairs[n] = []
videoImagePairs[n].push(videoFolder + filename)
})
})
if(videoImagePairs.length > 0){
videoImagePairs.forEach(async (pair,n) => {
var newImage = gm()
.in('-geometry', '+0+0')
.in(backgroundPath)
pair.forEach((imagePath) => {
newImage
.in('-geometry', '+0+0')
.in(imagePath)
})
await newImage.flatten()
.write(`${mergedFramesDirectory}${n}.jpg`, function (err) {
++response.numberOfFrames
if (err){console.log(err)};
if(n === videoImagePairs.length - 1){
response.endedAt = new Date()
response.timeSpent = response.endedAt - response.startedAt
resolve(response)
}
});
})
}else{
resolve(response)
}
})
}