fluent-ffmpeg / node-fluent-ffmpeg

A fluent API to FFMPEG (http://www.ffmpeg.org)
MIT License
7.85k stars 874 forks source link

vstack passthrough stream of buffered images #1287

Closed Divocaak closed 2 months ago

Divocaak commented 3 months ago

I have an array of buffered images and i need a script to concat them on top of each other.

The current error I am getting is this Invalid file index 1 in filtergraph description [0:v]scale=iw:ih[v0];[1:v]scale=iw:ih[v1];[2:v]scale=iw:ih[v2];[3:v]scale=iw:ih[v3];vstack=4

And I must say, it completely makes sense, because there is really just one input object - the PassThrough stream. But the stream contains the array of the inputs, am I right?

So how do I tell ffmpeg, that the rest of the inputs that its looking for is in the PassThhrough? Or is there any other way to vstack the buffered images?

I've already tried creating images from the buffered input images to make sure that they are not empty.

Version information

Code to reproduce

return new Promise((resolve, reject) => {
        const posterOutputPath = `${outputPath}/output.jpg`;

        const inputStream = new PassThrough();
        buffers.forEach(buffer => { inputStream.write(buffer); });
        inputStream.end();

        let filter = '';
        buffers.forEach((buffer, index) => {
            filter += `[${index}:v]scale=iw:ih[v${index}];`;
        });
        filter += `vstack=${buffers.length}`;

        console.log(filter);

        ffmpeg(inputStream)
            .inputFormat('image2pipe')
            .complexFilter(filter)
            .outputOptions(['-frames:v 1', '-pix_fmt yuv420p'])
            .output(posterOutputPath)
            .on('end', () => {
                console.log('Images concatenated successfully');
                resolve(posterOutputPath);
            })
            .on('error', (err, stdout, stderr) => {
                console.error('Error concatenating images:', err);
                console.log("ffmpeg stdout:", stdout);
                console.log("ffmpeg stderr:", stderr);
                reject(err);
            })
            .run();
    }
ffmpeg stdout:
ffmpeg stderr: ffmpeg version 6.0-tessus  https://evermeet.cx/ffmpeg/  Copyright (c) 2000-2023 the FFmpeg developers
  built with Apple clang version 11.0.0 (clang-1100.0.33.17)
  configuration: --cc=/usr/bin/clang --prefix=/opt/ffmpeg --extra-version=tessus --enable-avisynth --enable-fontconfig --enable-gpl --enable-libaom --enable-libass --enable-libbluray --enable-libdav1d --enable-libfreetype --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libmysofa --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopus --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvmaf --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-version3 --pkg-config-flags=--static --disable-ffplay
  libavutil      58.  2.100 / 58.  2.100
  libavcodec     60.  3.100 / 60.  3.100
  libavformat    60.  3.100 / 60.  3.100
  libavdevice    60.  1.100 / 60.  1.100
  libavfilter     9.  3.100 /  9.  3.100
  libswscale      7.  1.100 /  7.  1.100
  libswresample   4. 10.100 /  4. 10.100
  libpostproc    57.  1.100 / 57.  1.100
Input #0, image2pipe, from 'pipe:0':
  Duration: N/A, bitrate: N/A
  Stream #0:0: Video: mjpeg (Baseline), yuvj420p(pc, bt470bg/unknown/unknown), 2480x1080 [SAR 1:1 DAR 62:27], 25 fps, 25 tbr, 25 tbn
Invalid file index 1 in filtergraph description [0:v]scale=iw:ih[v0];[1:v]scale=iw:ih[v1];[2:v]scale=iw:ih[v2];[3:v]scale=iw:ih[v3];vstack=4.

Error: ffmpeg exited with code 1: Invalid file index 1 in filtergraph description [0:v]scale=iw:ih[v0];[1:v]scale=iw:ih[v1];[2:v]scale=iw:ih[v2];[3:v]scale=iw:ih[v3];vstack=4.
Divocaak commented 2 months ago

not necessary a issue, stackoverflow user taught me a workaround method