我想使用 ffmpeg 将 n x n 视频堆叠在网格中。例如:4x4、10x10、12x12,...由于我有很多视频,因此 ffmpeg 命令是在 python 中生成的,然后按顺序处理。 xstack 过滤器需要一个布局,其格式如下:
xstack=inputs=16:layout=0_0|0_h0|0_h0+h1|0_h0+h1+h2|w0_0|w0_h0|w0_h0+h1|w0_h0+h1+h2|w0+w4_0|
w0+w4_h0|w0+w4_h0+h1|w0+w4_h0+h1+h2|w0+w4+w8_0|w0+w4+w8_h0|w0+w4+w8_h0+h1|w0+w4+w8_h0+h1+h2
对于视频较少的布局,我手动编写了 xstack 过滤器,但对于 60x60 视频,这是不合理的。
在给定相等行和列的网格的情况下,如何在 python 中生成布局字符串?
对于完全填充的网格,您可以使用
interleave
和 tile
过滤器来大大简化过滤图表达式。类似...
[0:v]...[3599:v]interleave=3600,tile=60x60
警告:这假设所有输入具有相同的帧速率和相同的长度。如果输入帧未正确对齐,
interleave
可能会非常挑剔。
我不知道这条链的性能与
xstack
相比如何。
最后我用它来生成 xstack 过滤器的布局字符串。虽然很乱:
n =4
layout_col = ["h0"]
for i in range(n-2):
current_col = "h" + str(i+1)
current_col = layout_col[-1]+"+"+current_col
layout_col.append(current_col)
layout_col.insert(0,"0")
layout_row = ["w0"]
for i in range(n-2):
current_row = "w"+str((i+1)*n)
current_row = layout_row[-1]+"+"+current_row
layout_row.append(current_row)
layout_row.insert(0,"0")
layout = []
for i in range(n):
for j in range(n):
comb = layout_row[i] + "_" + layout_col[j]
layout.append(comb)
layout = "|".join(layout)
layout = "xstack=inputs="+str(n)+":layout="+layout
print (layout)
我尝试了您的布局字符串生成器脚本,但发现了一些小问题(输入数量不正确,不支持不同的 X/Y 网格数) 这是修复了这些问题的脚本:
x = 2
y = 3
layout_col = ["h0"]
for i in range(y-2):
current_col = "h" + str(i+1)
current_col = layout_col[-1]+"+"+current_col
layout_col.append(current_col)
layout_col.insert(0,"0")
layout_row = ["w0"]
for i in range(x-2):
current_row = "w"+str((i+1)*x)
current_row = layout_row[-1]+"+"+current_row
layout_row.append(current_row)
layout_row.insert(0,"0")
layout = []
for i in range(min(x,y)):
for j in range(max(x,y)):
comb = layout_row[i] + "_" + layout_col[j]
layout.append(comb)
layout = "|".join(layout)
layout = "xstack=inputs="+str(x*y)+":layout="+layout
print (layout)