使用cv2.VideoWriter与mss截屏生成无内容小视频文件问题排查
解决mss捕获屏幕生成OpenCV空视频的问题
你的问题核心是mss捕获的帧格式与OpenCV VideoWriter要求不匹配,加上编码与文件后缀不兼容,导致视频写入无效。以下是具体修复方案:
问题根源
- mss抓取的屏幕帧是BGRA四通道格式,而
cv2.VideoWriter仅支持BGR三通道的图像数据,直接写入四通道帧会导致视频无内容 - 你使用了
mp4v编码却将文件保存为.avi格式,部分编码器/播放器无法识别这种组合,导致视频无法正常生成
修复步骤
- 转换帧格式:将mss返回的BGRA帧转为OpenCV支持的BGR格式
- 匹配编码与后缀:要么将文件后缀改为
.mp4适配mp4v编码,要么改用MJPG/DIVX编码搭配.avi后缀 - 确保帧尺寸一致:转换后的帧尺寸必须与
VideoWriter初始化时指定的尺寸完全相同
修复后的完整代码
import numpy as np import cv2 import os from mss import mss width = 1600 height = 1024 bounding_box = {'top': 180, 'left': 3400, 'width': width, 'height': height} sct = mss() video_folder = 'C:/Users/Michael/Videos/Captures' # 改用mp4后缀匹配mp4v编码,或者换成'avi'搭配MJPG编码 video_name = "capture.mp4" videopathname = os.path.join(video_folder, video_name) # 用mp4v编码搭配mp4后缀,或者替换为cv2.VideoWriter_fourcc(*'MJPG')搭配avi后缀 video = cv2.VideoWriter(videopathname, cv2.VideoWriter_fourcc(*'mp4v'), 24, (width, height)) if video.isOpened(): print('Opened Video File') iFrame = 1 capturing = True while capturing: sct_img = sct.grab(bounding_box) frame = np.array(sct_img) # 关键:将BGRA转为BGR格式 frame_bgr = cv2.cvtColor(frame, cv2.COLOR_BGRA2BGR) cv2.imshow('Capture', frame) video.write(frame_bgr) iFrame += 1 print(iFrame) if cv2.waitKey(1) == ord('q'): capturing = False print("Finished!") cv2.destroyAllWindows() video.release() print(f'{videopathname} written and closed')
额外说明
- 如果坚持使用
.avi文件,将编码改为MJPG即可:cv2.VideoWriter_fourcc(*'MJPG'),同时视频名改回capture.avi - 测试时可以先减少捕获帧数(比如iFrame到50就停止),快速验证修复效果
内容的提问来源于stack exchange,提问作者Michael McLaughlin
相关产品推荐
相关产品推荐

