如何将序号步长为6的PNG图片拼接生成MP4视频(FPS=5)
解决FFmpeg处理步长为6的序号图片生成5fps MP4视频的问题
方案1:修正你的文本列表拼接法(保证帧率正确)
你的思路没问题,但原代码漏掉了帧率控制,直接运行的话视频速度会不对。给FFmpeg命令加上-r参数就能锁定输出帧率,修改后的代码如下:
import subprocess # 配置参数 output_fps = 5 input_path = "/content/drive/MyDrive/depth/depthframe_%04d.png" output_path = "/content/drive/MyDrive/depth.mp4" # 生成步长为6的图片路径列表 frames = [input_path % i for i in range(0, 2671, 6)] # 起始、结束数值按需调整 # 写入临时列表文件 with open('frames.txt', 'w') as f: for frame in frames: f.write(f"file '{frame}'\n") # 修正后的FFmpeg命令:添加-r参数锁定帧率 command = [ "ffmpeg", "-r", str(output_fps), # 输入阶段指定帧率,确保帧间隔符合要求 "-f", "concat", "-safe", "0", "-i", "frames.txt", "-c:v", "libx264", "-pix_fmt", "yuv420p", "-r", str(output_fps), # 输出阶段再次指定,双重保险 output_path ] subprocess.run(command, check=True)
方案2:用FFmpeg glob模式直接处理(更省事)
如果你的图片命名规范(比如depthframe_0000.png、depthframe_0006.png这种),可以不用生成临时文件,直接用通配符匹配+排序滤镜搞定:
ffmpeg -framerate 5 -pattern_type glob -i "/content/drive/MyDrive/depth/depthframe_*.png" -vf "sort=key=filename" -c:v libx264 -pix_fmt yuv420p "/content/drive/MyDrive/depth.mp4"
各参数作用:
-framerate 5:直接设定视频帧率为5,保证播放速度正确-pattern_type glob:允许用*通配符匹配所有目标图片-vf "sort=key=filename":强制按文件名排序,避免系统自动排序乱序- 这种方法不用写Python循环,适合快速批量处理
原代码的问题点
你之前的代码没加帧率参数,FFmpeg的concat分离器默认会把每帧按1fps处理,导致视频播放速度飞快。加上-r参数后,FFmpeg会按指定帧率分配每帧的播放时长,就能得到正常速度的5fps视频了。
内容的提问来源于stack exchange,提问作者DataStatsExplorer
相关产品推荐
相关产品推荐

