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

使用OpenCV从JPG生成视频却得到空白文件的问题求助

解决OpenCV写入空白视频的问题

问题根源分析

你的代码存在两个关键问题,导致视频无法正常写入:

  1. 视频尺寸参数顺序错误:cv2.VideoWriter要求尺寸参数为(宽度, 高度),但你传入的[120, 160]大概率是把高度放在了前面(OpenCV读取的图片形状是(高度, 宽度, 通道数)),尺寸不匹配会导致帧无法被写入。
  2. 未校验图片读取结果:如果cv2.imread返回None(比如图片路径错误、文件不存在),调用writer.write(None)不会触发报错,但也不会写入任何有效帧。

修正后的代码

import cv2

def record(writer):
    # 先读一张示例图,验证路径正确性并获取尺寸
    sample_img = cv2.imread("capture.0.jpg")
    if sample_img is None:
        print("错误:无法读取示例图片,请检查路径是否正确")
        return
    
    # 根据实际图片编号范围调整循环:如果图片是0-119共120张,用range(120);如果是1-120,用range(1,121)
    for i in range(120):
        img = cv2.imread(f"capture.{i}.jpg")
        if img is not None:
            writer.write(img)
        else:
            print(f"警告:无法读取capture.{i}.jpg,跳过该帧")

# 先确认示例图片可读取
sample_img = cv2.imread("capture.0.jpg")
if sample_img is None:
    print("错误:无法读取示例图片,程序退出")
else:
    # 从图片中提取正确的宽高参数
    img_width = sample_img.shape[1]
    img_height = sample_img.shape[0]
    
    fourcc = cv2.VideoWriter.fourcc(*'x264')
    # 传入正确的(宽度, 高度)参数
    writer = cv2.VideoWriter("py_test.mkv", fourcc, 60.0, (img_width, img_height))
    record(writer)
    writer.release()
    print("视频写入完成")

额外注意事项

  • 图片编号匹配:你的FFmpeg命令用capture.%d.jpg默认从capture.1.jpg开始读取,若你的图片实际是1-120命名,要把循环改成range(1, 121)。
  • 编码兼容性:Ubuntu apt安装的OpenCV对x264编码支持有限,若仍有问题,可尝试MJPG编码(fourcc = cv2.VideoWriter.fourcc(*'MJPG'))搭配.avi容器,兼容性更强。
  • 权限检查:确保当前用户对输出目录有写入权限,避免因权限不足导致文件写入不完整。

内容的提问来源于stack exchange,提问作者SebL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 02:12:21