ffmpeg-concat
Version:
Concats a list of videos together using ffmpeg with sexy OpenGL transitions.
80 lines (67 loc) • 1.6 kB
JavaScript
const ffmpeg = require('fluent-ffmpeg')
const onTranscodeProgress = require('ffmpeg-on-progress')
module.exports = async (opts) => {
const {
args,
log,
audio,
frameFormat,
framePattern,
onProgress,
output,
theme,
verbose
} = opts
return new Promise((resolve, reject) => {
const inputOptions = [
'-framerate', theme.fps
]
if (frameFormat === 'raw') {
Array.prototype.push.apply(inputOptions, [
'-vcodec', 'rawvideo',
'-pixel_format', 'rgba',
'-video_size', `${theme.width}x${theme.height}`
])
}
const cmd = ffmpeg(framePattern)
.inputOptions(inputOptions)
if (audio) {
cmd.addInput(audio)
}
const outputOptions = []
// misc
.concat([
'-hide_banner',
'-map_metadata', '-1',
'-map_chapters', '-1'
])
// video
.concat(args || [
'-c:v', 'libx264',
'-profile:v', 'main',
'-preset', 'medium',
'-crf', '20',
'-movflags', 'faststart',
'-pix_fmt', 'yuv420p',
'-r', theme.fps
])
// audio
.concat(!audio ? [] : [
'-c:a', 'copy'
])
if (onProgress) {
cmd.on('progress', onTranscodeProgress(onProgress, theme.duration))
}
if (verbose) {
cmd.on('stderr', (err) => console.error(err))
}
cmd
.outputOptions(outputOptions)
.output(output)
.on('start', (cmd) => log({ cmd }))
.on('end', () => resolve())
.on('error', (err) => reject(err))
.run()
})
}