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
相关产品推荐
相关产品推荐

