Python录屏程序运行报错:AttributeError: 'NoneType'对象无'shape'属性
报错根因定位
触发AttributeError: 'NoneType' object has no attribute 'shape'的核心原因是webcam.read()调用失败,返回的帧对象frame为空,后续强行读取shape属性触发报错,常见诱因有3种:
- 摄像头索引配置错误:你当前代码使用索引
1调用摄像头,绝大多数Windows设备默认内置摄像头的索引为0,如果没有外接额外摄像头的情况下,索引1找不到可用设备 - 摄像头被占用/无权限:其他软件正在占用摄像头,或者系统没有给Pycharm、Python解释器开放摄像头调用权限
- 无读取结果校验逻辑:
webcam.read()的第一个返回值为帧读取是否成功的布尔标识,你当前代码直接忽略该标识,读取失败时操作空对象必然报错
另外日志中的WARN是Windows平台MediaFoundation视频后端的兼容性提示,不影响核心功能,也可以通过切换后端消除。
完整修复代码
import datetime from PIL import ImageGrab import numpy as np import cv2 from win32api import GetSystemMetrics width = GetSystemMetrics(0) height = GetSystemMetrics(1) time_stamp = datetime.datetime.now().strftime('%Y-%m-%d %H-%M-%S') file_name = f'{time_stamp}.mp4' fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') captured_video = cv2.VideoWriter(file_name, fourcc, 20.0, (width, height)) # 1. 摄像头索引默认改成0,加CAP_DSHOW后端消除Windows平台WARN提示,多个摄像头可依次试0/1/2 webcam = cv2.VideoCapture(0, cv2.CAP_DSHOW) # 2. 校验摄像头是否成功打开 if not webcam.isOpened(): print("摄像头调用失败,请检查索引、权限或是否被其他软件占用") exit() while True: img = ImageGrab.grab(bbox=(0, 0, width, height)) img_np = np.array(img) img_final = cv2.cvtColor(img_np, cv2.COLOR_BGR2RGB) # 3. 校验帧读取是否成功 ret, frame = webcam.read() if ret: fr_height, fr_width, _ = frame.shape img_final[0:fr_height, 0: fr_width, :] = frame[0: fr_height, 0: fr_width, :] cv2.imshow('Secret Capture', img_final) captured_video.write(img_final) if cv2.waitKey(10) == ord('q'): break # 程序退出前释放资源 webcam.release() captured_video.release() cv2.destroyAllWindows()
额外说明
如果修改索引为0后依然无法读取摄像头,可以依次尝试以下操作:
- 关闭所有正在调用摄像头的软件(比如微信、QQ、相机应用等)
- 进入Windows设置→隐私和安全性→摄像头,确认「允许应用访问你的相机」权限已开启,同时确认Pycharm的权限已经放开
- 如果是外接USB摄像头,可以换个USB口重新插拔后再试
内容的提问来源于stack exchange,提问作者Neevraj Kumarpal Bokria
相关产品推荐
相关产品推荐

