python 中的 ffmpeg xstack 布局

问题描述 投票:0回答:3

我想使用 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 中生成布局字符串?

python ffmpeg
3个回答
0
投票

对于完全填充的网格,您可以使用

interleave
tile
过滤器来大大简化过滤图表达式。类似...

[0:v]...[3599:v]interleave=3600,tile=60x60

警告:这假设所有输入具有相同的帧速率和相同的长度。如果输入帧未正确对齐,

interleave
可能会非常挑剔。

我不知道这条链的性能与

xstack
相比如何。


0
投票

最后我用它来生成 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)

0
投票

我尝试了您的布局字符串生成器脚本,但发现了一些小问题(输入数量不正确,不支持不同的 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)
© www.soinside.com 2019 - 2024. All rights reserved.