You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用fluent-ffmpeg将缓冲图像垂直拼接遇错求助

解决fluent-ffmpeg垂直拼接多个图像buffer报错问题

错误原因分析

你遇到的Invalid file index 1报错,核心问题是输入源的理解偏差:
你把所有图像buffer合并成单个PassThrough流传给ffmpeg,这在ffmpeg中被识别为一个输入源(索引0),但你的filter却尝试引用[1:v]、[2:v]这类多输入索引,自然会找不到对应的流。

修正方案

不要合并buffer为单一流,而是将每个图像buffer作为ffmpeg的独立输入,这样每个输入对应一个索引,filter就能正确匹配到对应流。

修正后的代码

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

    // 初始化ffmpeg实例,不预先传入输入
    const ffmpegProc = ffmpeg();

    // 为每个图像buffer添加独立输入
    buffers.forEach(buffer => {
        ffmpegProc.input(buffer)
            .inputFormat('image2pipe');
    });

    // 构建复合滤镜链
    let filterChain = '';
    buffers.forEach((_, index) => {
        // 对每个输入流做缩放(保持原尺寸,可根据需求修改)
        filterChain += `[${index}:v]scale=iw:ih[v${index}];`;
    });
    // 拼接所有处理后的流,传给vstack完成垂直拼接
    const vstackInputs = buffers.map((_, idx) => `[v${idx}]`).join('');
    filterChain += `${vstackInputs}vstack=${buffers.length}`;

    console.log(filterChain);

    ffmpegProc.complexFilter(filterChain)
        .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();
});

关键调整点

  • 多输入处理:每个图像buffer单独作为ffmpeg输入,确保每个输入对应唯一索引(0、1、2...),filter中的[index:v]能正确定位流。
  • 滤镜链修正:将处理后的流[v0][v1]...拼接后传给vstack,明确告诉ffmpeg需要拼接的所有流。
  • 移除不必要的流合并:直接使用buffer作为输入,无需PassThrough中转,简化逻辑。

可选优化

如果你的图像尺寸不一致,可以修改scale参数统一尺寸,比如保持宽度一致、高度按比例缩放:

scale=1920:-2

这样vstack会自动对齐宽度,避免拼接后出现错位。

内容的提问来源于stack exchange,提问作者Divocak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 13:55:10