如何用超25万帧生成7小时视频 解决OpenCV内存过载问题
解决方案
你当前代码内存溢出的核心原因是将全部25万+帧一次性加载到内存列表img_array中,按1080P分辨率单帧约6MB计算,25万帧总内存占用超过1.5TB,远超普通设备内存上限,完全没必要将所有帧缓存到内存。
优化方案:边读边写,不缓存全量帧
核心逻辑是提前获取所有帧的有序路径,先初始化视频写入器,每读取1帧就直接写入视频,内存仅占用单帧大小,再多帧也不会溢出。
注意事项
- 必须先对读取的帧文件路径排序,
glob默认返回的路径顺序不一定和帧序号一致,会导致生成的视频画面顺序错乱 - 帧率参数要和原视频的实际帧率匹配,避免最终视频时长不对
- 编码格式要和输出文件后缀对应:
DIVX对应.avi,mp4v对应.mp4
优化后代码
import cv2 import glob import os # 第一步:获取所有帧路径并排序,确保顺序正确 frame_paths = glob.glob('C:/New folder/Images/*.jpg') # 按文件名数字序号排序,适配frame_0001.jpg这类命名格式,可根据自己的命名规则调整排序逻辑 frame_paths.sort(key=lambda x: int(os.path.splitext(os.path.basename(x))[0].split('_')[-1])) if not frame_paths: raise ValueError("未找到任何帧图片") # 第二步:读取第一张帧获取尺寸,初始化VideoWriter first_frame = cv2.imread(frame_paths[0]) if first_frame is None: raise IOError("首帧读取失败,请检查路径是否正确") height, width = first_frame.shape[:2] size = (width, height) # 第三个参数为帧率,请替换为你原视频的实际帧率,比如原视频是25帧就填25 out = cv2.VideoWriter('project.avi', cv2.VideoWriter_fourcc(*'DIVX'), 15, size) # 先写入已经读取的首帧 out.write(first_frame) # 第三步:遍历剩余帧,读一帧写一帧,不缓存到列表 for path in frame_paths[1:]: img = cv2.imread(path) if img is None: print(f"警告:帧{path}读取失败,已跳过") continue out.write(img) # 释放资源 out.release() cv2.destroyAllWindows()
额外优化建议
- 如果你还没处理完原视频帧,完全可以在处理每帧的时候直接写入视频,不用先把所有处理后的帧存到本地再二次读取合并,能省掉大量磁盘IO时间
- 要是需要生成多段视频再拼接,也可以用同样的逻辑,遍历每段视频的帧依次写入同一个VideoWriter即可
内容的提问来源于stack exchange,提问作者Geox
相关产品推荐
相关产品推荐

