使用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
相关产品推荐
相关产品推荐

