fluent-ffmpeg from an array of input files
Asked Answered
T

1

8

I want to use fluent-ffmpeg to create a video of last n images of a directory, or database entries.

Which is the correct syntax?

These are my tries:

Mimic shell command

ffmpeg()
  .addInput('ls *png | tail -n 17')
  .inputOptions("-pattern_type glob")
  .output("output.mp4").run()

but it does not accept shell commands;

space - separated paths

ffmpeg()
  .addInput('a*.png b*.png ')
  .inputOptions("-pattern_type glob")
  .output("output.mp4").run()

but it does not accept list of files separated by spaces;

Array of image paths

ffmpeg()
  .addInput(array) // ['aa.png', 'a1.png',,,'bbb.png']
  .inputOptions("-pattern_type glob")
  .output("output.mp4").run()

but it does not accept arrays.

EDIT:

Also, from Merge Multiple Videos using node fluent ffmpeg, I am able to add multiple inputs using an array of files as

var ffmpeg= require('fluent-ffmpeg');
var f=ffmpeg() 
pngarr.forEach(p => f.input(p)) /// pngarr is my array of png paths

But running

f.output("./output.mp4").run()

I obtain just a video of 0 seconds containing the first png of the list.

Tankoos answered 15/12, 2016 at 2:52 Comment(0)
Y
7

The ffmpeg methods are chainable, so you could use a reducer like so:

var chainedInputs = inputlist.reduce((result, inputItem) => result.addInput(inputItem), ffmpeg());

Your last edit nearly did the same thing, but it keeps calling .input() on the same level instead of on top of the previous

Yellow answered 30/7, 2017 at 15:28 Comment(2)
But chainedInputs.output("./output.mp4").run() still returns a 0 seonds video containing the first png of the listTankoos
The reduce method works for me, but I have so many input videos that the resulting command was too long and could not be executed. Is there a way to input a text file with a list of video files? #51035456Spinnaker

© 2022 - 2024 — McMap. All rights reserved.