我有 1920 张分辨率为 1920x1080 的图像。我将每个图像切成 1x1080 的切片。它们位于标记为 img0001_slices、img0002_slices、...img1920_slices 的文件夹中。在文件夹中,切片标记为 img0001_slice_0、img0001_slice_1、... img0001_slice_1919。我想使用 ffmpeg 从切片中形成新图像。新图像应该是从左侧的 img1920 到右侧的 img0001 水平排列的所有原始图像的第一个切片。新图像二应该是相同顺序的原始图像的第二个切片,新图像三应该是第三个,依此类推。
到目前为止,我一直在尝试让 shell 脚本工作,我首先创建一个要组合的所有不同切片的文本文件,即
slice_0_inputs.txt
file 'img1920_slices/img1920_slice_0.png'
file 'img1919_slices/img1919_slice_0.png'
file 'img1918_slices/img1918_slice_0.png'
.
.
.
file 'img0001_slices/img0001_slice_0.png'
然后我就跑了
ffmpeg -f concat -i slice_0_inputs.txt -filter_complex "hstack=inputs=1920" reconstructed_slice_0.png
但我不断收到错误
Cannot find a matching stream for unlabeled input pad hstack
Error binding filtergraph inputs/outputs: Invalid argument
我尝试将文件 slice_0_inputs.txt 减少到只有 2 个文件路径并运行
ffmpeg -f concat -i slice_0_inputs.txt -filter_complex "[0:v][1:v]hstack=inputs=2" test.png
但我收到错误
Invalid file index 1 in filtergraph description [0:v][1:v]hstack=inputs=2.
Error binding filtergraph inputs/outputs: Invalid argument
有人可以帮助我理解我在这里遇到的问题吗?
从串联解复用器馈送的输入是由串联的串联帧组成的单个输入。 hstack 需要并行输入,因此需要多个
-i
声明。然而,在这种情况下,效率非常低。
您可以继续使用 concat 方法,但使用平铺过滤器。
ffmpeg -f concat -i slice_0_inputs.txt -filter:v "tile=layout=1920x1" reconstructed_slice_0.png
您不需要将列切片保存为单独的文件。您可以创建全尺寸图像的连续列表,然后连续运行,
ffmpeg -f concat -i full_inputs.txt -filter:v "crop=1:ih:X:0:exact=1,tile=layout=1920x1" reconstructed_slice_X.png
其中 X 从 0 迭代到 1979。