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

使用OpenCV保存视频失败 输出0KB文件无法打开如何解决

问题根因

你的代码存在3个直接导致输出视频为0KB的核心问题:

  • 无效的编码器标识:你传入的FourCC编码VIDX不存在,OpenCV无法调用对应编码器完成视频写入,跨平台兼容性最好的通用编码为XVID。
  • 帧尺寸与初始化参数不匹配:初始化VideoWriter时你指定的输出分辨率为(1000, 1200),但读取到的原始帧尺寸和该参数不一致,且你没有对帧做缩放处理,尺寸不匹配时OpenCV会直接跳过写入操作,不会主动抛出错误提示。
  • 缺失状态校验逻辑:代码没有校验帧读取状态、写入器是否初始化成功,出现异常时无法第一时间定位问题。
修复方案
  1. 优先使用原视频参数初始化写入器,避免尺寸、帧率不匹配问题;如果需要自定义输出分辨率,必须将每帧缩放到对应尺寸后再写入。
  2. 替换为可正常识别的FourCC编码,输出文件后缀使用和编码匹配的格式(XVID对应.avi格式兼容性最佳)。
  3. 增加必要的状态判断,避免对空帧、未初始化的写入器执行无效操作。

修复后的完整代码:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 03:12:15