使用OpenCV从JPG生成视频却得到空白文件的问题求助
解决OpenCV写入空白视频的问题
问题根源分析
你的代码存在两个关键问题,导致视频无法正常写入:
- 视频尺寸参数顺序错误:
cv2.VideoWriter要求尺寸参数为(宽度, 高度),但你传入的[120, 160]大概率是把高度放在了前面(OpenCV读取的图片形状是(高度, 宽度, 通道数)),尺寸不匹配会导致帧无法被写入。 - 未校验图片读取结果:如果
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
相关产品推荐
相关产品推荐

