使用OpenCV保存视频失败 输出0KB文件无法打开如何解决
问题根因
你的代码存在3个直接导致输出视频为0KB的核心问题:
- 无效的编码器标识:你传入的FourCC编码
VIDX不存在,OpenCV无法调用对应编码器完成视频写入,跨平台兼容性最好的通用编码为XVID。 - 帧尺寸与初始化参数不匹配:初始化
VideoWriter时你指定的输出分辨率为(1000, 1200),但读取到的原始帧尺寸和该参数不一致,且你没有对帧做缩放处理,尺寸不匹配时OpenCV会直接跳过写入操作,不会主动抛出错误提示。 - 缺失状态校验逻辑:代码没有校验帧读取状态、写入器是否初始化成功,出现异常时无法第一时间定位问题。
修复方案
- 优先使用原视频参数初始化写入器,避免尺寸、帧率不匹配问题;如果需要自定义输出分辨率,必须将每帧缩放到对应尺寸后再写入。
- 替换为可正常识别的FourCC编码,输出文件后缀使用和编码匹配的格式(
XVID对应.avi格式兼容性最佳)。 - 增加必要的状态判断,避免对空帧、未初始化的写入器执行无效操作。
修复后的完整代码:
import cv2 cap = cv2.VideoCapture("Path to source video") # 读取原视频的帧率、宽高参数 fps = cap.get(cv2.CAP_PROP_FPS) frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 如果需要自定义输出尺寸,取消下一行注释,替换为目标尺寸 # output_width, output_height = 1000, 1200 # 注意:VideoWriter的尺寸参数顺序固定为(宽,高),不要写反 # 初始化写入器 out = cv2.VideoWriter( "Path to save video.avi", # XVID编码对应后缀为.avi cv2.VideoWriter_fourcc(*"XVID"), fps, (frame_width, frame_height) # 使用自定义尺寸时替换为(output_width, output_height) ) print(f"输入视频打开状态:{cap.isOpened()}") print(f"输出写入器初始化状态:{out.isOpened()}") while cap.isOpened(): ret, frame = cap.read() # 帧读取失败(视频读完/读取出错)时直接跳出循环 if not ret: break # 使用自定义输出尺寸时,取消下一行注释完成帧缩放 # frame = cv2.resize(frame, (output_width, output_height)) out.write(frame) cv2.imshow('frame', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() out.release() cv2.destroyAllWindows()
额外注意事项
- 如果需要输出mp4格式文件,可以将FourCC替换为
*"mp4v",文件后缀改为.mp4,但该编码在部分OpenCV版本下可能存在兼容问题,排查问题阶段优先用XVID+avi格式测试。 - 所有资源释放操作必须在循环结束后执行,不要在循环内提前释放写入器。
内容的提问来源于stack exchange,提问作者Maksudur Rahman
相关产品推荐
相关产品推荐

