我一整天都被这个问题困扰。我有一个缓冲图像数组,我需要一个脚本将它们连接在一起。
我尝试使用 Sharp 包来做到这一点,但由于我已经因为其他原因在项目中使用 Fluent-ffmpeg,所以我想继续使用它。另外,我无法在 m1 mac 上正确安装该软件包。
我当前收到的错误是这样的
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.
我必须说,这完全有道理,因为实际上只有一个输入对象 - PassThrough 流。但流包含输入数组,对吗?
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 -f image2pipe -i pipe:0 -vf tile=layout=1x4 -frames:v 1 -pix_fmt yuv420p output.jpg
它可以在这里工作,因为所有堆叠的图像都应具有相同的尺寸和像素格式。只是不要为行或列设置非常大的数字,因为这可能会违反图像大小限制。