如何用Python生成FFmpeg xstack滤镜的n×n视频网格布局字符串
n×n正方形视频网格FFmpeg拼接参数生成方案
使用FFmpeg的xstack滤镜拼接规则网格视频时,小规格网格可以手动编写布局参数,但10x10、12x12乃至60x60这类大规模网格,手写参数效率极低且容易出错,可通过Python按xstack的参数规则自动生成符合要求的布局字符串。
xstack布局参数规则
xstack的layout参数遵循固定格式:
- 每个输入视频的位置用
x坐标表达式_y坐标表达式表示,不同视频的位置串用|分隔 - 横向x轴:同排第k列(从0开始计数)的视频,x坐标为前序所有列第一个视频的宽度累加,例如4x4网格第3列的x坐标为
w0+w4+w8 - 纵向y轴:同列第k行(从0开始计数)的视频,y坐标为前序所有行第一个视频的高度累加,例如4x4网格第3行的y坐标为
h0+h1+h2 - 输入视频顺序需和位置串顺序对应,按逐行从左到右的顺序排列即可
可直接使用的Python生成代码
def generate_xstack_layout(grid_n: int) -> tuple[int, str]: """ 生成n×n正方形网格对应的xstack滤镜完整参数 :param grid_n: 网格行列数,例如传4对应4x4网格 :return: 输入视频总数、layout布局字符串 """ pos_list = [] for row_idx in range(grid_n): # 拼接当前行的y坐标表达式 if row_idx == 0: y_expr = "0" else: y_expr = "+".join([f"h{i}" for i in range(row_idx)]) for col_idx in range(grid_n): # 拼接当前列的x坐标表达式 if col_idx == 0: x_expr = "0" else: # 每列第一个视频的输入索引为 列号 * grid_n x_expr = "+".join([f"w{c * grid_n}" for c in range(col_idx)]) pos_list.append(f"{x_expr}_{y_expr}") input_total = grid_n * grid_n layout_str = "|".join(pos_list) return input_total, layout_str # 调用示例 if __name__ == "__main__": # 可按需修改网格规格,支持任意正整数n n = 4 input_count, layout = generate_xstack_layout(n) xstack_filter = f"xstack=inputs={input_count}:layout={layout}" print("生成的xstack滤镜参数:") print(xstack_filter)
运行上述代码传入n=4时,生成的布局字符串和官方示例格式完全一致,传入n=60即可直接生成60x60网格对应的3600个位置参数,无手动编写的出错风险。
使用注意事项
- 传入FFmpeg的输入视频顺序必须和生成的位置顺序一致:先传第一行从左到右的n个视频,再传第二行从左到右的n个视频,以此类推
- 若所有输入视频分辨率完全统一,可额外在xstack滤镜中添加对齐参数,不影响布局字符串的生成逻辑
- 超大规模网格(如60x60)拼接时注意预留足够内存,避免FFmpeg进程因内存不足退出
内容的提问来源于stack exchange,提问作者konrad
相关产品推荐
相关产品推荐

