You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 22:01:11