You need to enable JavaScript to run this app. ffmpeg-python中如何为input方法传入有序自定义图片列表?
优惠活动
大模型
产品
解决方案
定价
更多

ffmpeg-python中如何为input方法传入有序自定义图片列表?

ffmpeg 图片序列合成的有序输入实现方案

针对glob字典序乱序、需要自定义选择图片的需求,完全可以绕开通配符匹配逻辑,通过Python端前置处理实现可控的输入逻辑,不需要依赖文件路径的自动匹配。

核心实现思路

先在Python端完成两个前置操作,再把处理好的有序文件列表传给ffmpeg:

  • 自主筛选需要纳入合成的图片文件,可根据序号、文件属性等任意规则过滤不需要的内容
  • 按数字自然序对筛选后的文件排序,彻底规避字符串字典序带来的1、100、11类乱序问题

推荐实现:concat管道输入(适配所有灵活筛选场景)

这个方案不要求图片文件名连续,支持任意跳号、自定义顺序、自定义筛选规则,灵活性最高。
首先导入依赖:

import os
import ffmpeg

第一步:自定义筛选+排序

image_root = "/path/to/images"
selected_list = []
# 遍历目录下的文件,按自己的规则筛选
for fname in os.listdir(image_root):
    if not fname.endswith(".jpg"):
        continue
    # 提取文件名中的纯数字序号
    try:
        frame_seq = int(os.path.splitext(fname)[0])
    except ValueError:
        # 跳过文件名不含纯数字的文件
        continue
    # 自定义筛选规则:比如仅纳入20-100序号的文件,可根据需求修改判断条件
    if 20 <= frame_seq <= 100:
        full_path = os.path.join(image_root, fname)
        selected_list.append((frame_seq, full_path))
# 按数字序号排序,解决字典序乱序问题
selected_list.sort(key=lambda item: item[0])
sorted_paths = [item[1] for item in selected_list]

第二步:构造concat格式的输入流,直接通过内存管道传给ffmpeg,不需要生成临时清单文件

fps = 20
frame_duration = 1 / fps
# 拼接concat协议需要的内容
concat_buffer = ""
for path in sorted_paths:
    # 转义路径中的单引号,避免特殊字符导致报错
    safe_path = path.replace("'", "'\\''")
    concat_buffer += f"file '{safe_path}'\n"
    concat_buffer += f"duration {frame_duration}\n"
# 按ffmpeg concat demuxer的要求,最后一帧需要重复写入一次路径,否则会丢最后一帧
concat_buffer += f"file '{sorted_paths[-1]}'\n"

第三步:启动合成

(
    ffmpeg
    .input(
        "pipe:",
        format="concat",
        safe=0
    )
    .output(
        "output_video.mp4",
        vcodec="libx264",
        pix_fmt="yuv420p"
    )
    .run(
        input_data=concat_buffer.encode("utf-8"),
        capture_stderr=True
    )
)

简化方案:数字序列模式(仅适配连续无跳过场景)

如果所有图片都需要纳入合成、没有需要跳过的文件,只是glob排序乱序,可以直接用ffmpeg自带的序列匹配模式,比concat更简单:

(
    ffmpeg
    .input(
        "/path/to/images/%d.jpg",
        start_number=1, # 指定起始帧的序号
        framerate=20
    )
    .output("output_video.mp4")
    .run()
)

这个模式的局限是要求图片序号完全连续,比如1.jpg之后直接是2.jpg,中间没有缺失,否则会在缺文件的位置直接报错,不支持自定义筛选。

注意事项

  • 不要直接对os.listdir返回的文件名列表做字符串排序,这个逻辑和glob通配的字典序规则完全一致,一定会出现乱序,必须提取文件名中的数字转为整数后再排序
  • 构造concat内容时如果路径包含空格、特殊符号,一定要做好转义,同时在input参数里加safe=0,否则ffmpeg会无法识别路径
  • 用concat模式时,视频编码建议固定用libx264、像素格式设为yuv420p,避免生成的视频在部分播放器上无法正常解码

内容的提问来源于stack exchange,提问作者se7en

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 08:54:03