javascriptnode.jsffmpegffmpeg-wasm

node ffmpeg programmatically built list(?) of commands


I am working on a ffmpeg wasm project and I have it working with this code:

        await ffmpeg.run(
            '-loop', '1',
            '-framerate', '2',
            "-i", inputFileNames[0], 
            "-i", inputFileNames[1],
            "-i", inputFileNames[2],
            "-c:a", "libmp3lame", 
            "-b:a", "320k", 
            "-filter_complex", "concat=n=2:v=0:a=1",
            "-vcodec", "libx264", 
            "-bufsize", "3M", 
            "-filter:v", "scale=w=1920:h=1930,pad=ceil(iw/2)*2:ceil(ih/2)*2", 
            "-crf", "18", 
            "-pix_fmt", "yuv420p", 
            "-shortest", "", 
            "-tune", "stillimage", 
            "-t", "13", 
            outputFileName
        );

https://github.com/MartinBarker/ffmpeg-wasm-node

As you can see, the await ffmpeg.run() command takes a list of args / vars to run. I have it statically set to take three file inputs right now (-i) but I need to have these inputs set dynamically for however many strings are inside the inputFileNames[] list.

I've tried giving await ffmpeg.run(myListArgs) a var containing a list of the same args but that does not work but this causes an error as it only runs the last var outputFIlename so this below does not work:

        let ffmpegArgs=('-loop', '1',
        '-framerate', '2',
        "-i", inputFileNames[0], 
        "-i", inputFileNames[1],
        "-i", inputFileNames[2],
        "-c:a", "libmp3lame", 
        "-b:a", "320k", 
        "-filter_complex", "concat=n=2:v=0:a=1",
        "-vcodec", "libx264", 
        "-bufsize", "3M", 
        "-filter:v", "scale=w=1920:h=1930,pad=ceil(iw/2)*2:ceil(ih/2)*2", 
        "-crf", "18", 
        "-pix_fmt", "yuv420p", 
        "-shortest", "", 
        "-tune", "stillimage", 
        "-t", "13", 
        outputFileName)

        await ffmpeg.run(
            ffmpegArgs
        );

I've tried to include multiple inputs in one line like so but it results in an error:


        await ffmpeg.run(
            '-loop', '1',
            '-framerate', '2',
            `-i ${inputFileNames[0]} -i ${inputFileNames[1]} -i ${inputFileNames[2]}`,
            "-c:a", "libmp3lame", 
            "-b:a", "320k", 
            "-filter_complex", "concat=n=2:v=0:a=1",
            "-vcodec", "libx264", 
            "-bufsize", "3M", 
            "-filter:v", "scale=w=1920:h=1930,pad=ceil(iw/2)*2:ceil(ih/2)*2", 
            "-crf", "18", 
            "-pix_fmt", "yuv420p", 
            "-shortest", "", 
            "-tune", "stillimage", 
            "-t", "13", 
            outputFileName
        );

[fferr] Unrecognized option 'i input-file-0 -i input-file-1 -i input-file-2'.
[fferr] Error splitting the argument list: Option not found
[ffout] FFMPEG_END

I've tried having only the inputs as a list, and using the ... to expand it inside the function call but that causes an error as well as the commas are included in the command (which they shouldnt be)

        let ffmpegInputs=[
            "-i", inputFileNames[0], 
            "-i", inputFileNames[1],
            "-i", inputFileNames[2]
        ]
        await ffmpeg.run(
            '-loop', '1',
            '-framerate', '2',
            [...ffmpegInputs],
            "-c:a", "libmp3lame", 
            "-b:a", "320k", 
            "-filter_complex", "concat=n=2:v=0:a=1",
            "-vcodec", "libx264", 
            "-bufsize", "3M", 
            "-filter:v", "scale=w=1920:h=1930,pad=ceil(iw/2)*2:ceil(ih/2)*2", 
            "-crf", "18", 
            "-pix_fmt", "yuv420p", 
            "-shortest", "", 
            "-tune", "stillimage", 
            "-t", "13", 
            outputFileName
        );

[info] run ffmpeg command: -loop 1 -framerate 2 -i,input-file-0,-i,input-file-1,-i,input-file-2 -c:a libmp3lame -b:a 320k -filter_complex concat=n=2:v=0:a=1 -vcodec libx264 -bufsize 3M -filter:v scale=w=1920:h=1930,pad=ceil(iw/2)*2:ceil(ih/2)*2 -crf 18 -pix_fmt yuv420p -shortest  -tune stillimage -t 13 cool-output-video.mp4
TypeError: a.charCodeAt is not a function

How can I create my ffmpeg args dynamically to work for any number of inputs?


Solution

  • fixed with syntax like so:

                '-framerate', '2',
                ...ffmpegInputs,
                "-c:a", "libmp3lame",