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

使用cv2.VideoWriter与mss截屏生成无内容小视频文件问题排查

解决mss捕获屏幕生成OpenCV空视频的问题

你的问题核心是mss捕获的帧格式与OpenCV VideoWriter要求不匹配,加上编码与文件后缀不兼容,导致视频写入无效。以下是具体修复方案:

问题根源

  • mss抓取的屏幕帧是BGRA四通道格式,而cv2.VideoWriter仅支持BGR三通道的图像数据,直接写入四通道帧会导致视频无内容
  • 你使用了mp4v编码却将文件保存为.avi格式,部分编码器/播放器无法识别这种组合,导致视频无法正常生成

修复步骤

  1. 转换帧格式:将mss返回的BGRA帧转为OpenCV支持的BGR格式
  2. 匹配编码与后缀:要么将文件后缀改为.mp4适配mp4v编码,要么改用MJPG/DIVX编码搭配.avi后缀
  3. 确保帧尺寸一致:转换后的帧尺寸必须与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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 09:46:06