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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:36:03