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.
54 lines (52 loc) • 2.09 kB
JavaScript
const {
rawDirectory,
mergedFramesDirectory,
firstFrameDirectory,
createBaseFolder,
} = require('./utils.js');
const fs = require('fs');
const { extractFramesFromVideo } = require('./extractFramesFromVideosAndRemoveBackgrounds.js');
const { mergeFramePairs } = require('./mergeFramePairs.js');
const { createVideoFromJpegImages } = require('./createVideoFromMergedFrames.js');
exports.extractFramesFromVideo = extractFramesFromVideo
exports.mergeFramePairs = mergeFramePairs
exports.createVideoFromJpegImages = createVideoFromJpegImages
exports.run = async (options) => {
if(!options.videos)return console.log('No Videos Provided')
const videos = options.videos
// create folders
createBaseFolder(rawDirectory)
createBaseFolder(firstFrameDirectory)
createBaseFolder(mergedFramesDirectory)
// extract frames and remove backgrounds, BackgroundSubtractorMOG2
for (let i = 0; i < videos.length; i++) {
const videoName = videos[i];
console.log(`Extracting frames from video named "${videoName}.mp4"...`)
await extractFramesFromVideo(videoName);
console.log(`Done extracting frames from "${videoName}.mp4"!`)
}
// create listing of which frames to overlap then merge them and write into ${rawDirectory}
console.log("Merging Frames Extracted...")
const mergeFramePairsResponse = await mergeFramePairs(
//folder where files are
rawDirectory,
//file list (videoNames only, not full path)
fs.readdirSync(rawDirectory)
)
// create a video from merged frames
console.log("Create Video From Merged Frames...")
const buildResponse = await createVideoFromJpegImages(
//folder where files are
mergedFramesDirectory,
//file list (filenames only, not full path)
fs.readdirSync(mergedFramesDirectory),
//fps
options.fps || 25
)
console.log("Completed Building!")
console.log(buildResponse)
return {
mergeFramePairs: mergeFramePairsResponse,
videoBuild: buildResponse,
}
}