如何使用Python实现类似Win+Alt+G功能录制最近30秒屏幕内容
实现方案
核心原理
要实现「录制触发前一段时间的画面」这个需求,本质是做一个循环帧缓存:
- 程序启动后就一直在后台捕获屏幕帧,写入一个固定长度的缓存队列
- 队列最大长度 = 设定帧率 × 需要缓存的秒数,新帧加入时自动把最旧的帧挤掉,始终保留最近指定时长的画面
- 当你触发保存操作时,把缓存队列里的所有帧按顺序写入视频文件即可,和Xbox Game Bar的Win+Alt+G录屏逻辑完全一致
修改后完整代码
import pyautogui import cv2 import numpy as np from collections import deque from datetime import datetime # 基础参数配置 resolution = (1920, 1080) codec = cv2.VideoWriter_fourcc(*"XVID") fps = 30.0 # 建议根据设备性能调整,pyautogui截图性能有限,1080p下30fps更稳定 CACHE_DURATION_SEC = 30 # 缓存最近30秒的画面,可自行修改 # 计算缓存队列最大长度 max_cache_frames = int(fps * CACHE_DURATION_SEC) # 初始化循环缓存队列,超过长度自动丢弃最旧帧 frame_cache = deque(maxlen=max_cache_frames) cv2.namedWindow("Live", cv2.WINDOW_NORMAL) cv2.resizeWindow("Live", 480, 270) while True: # 捕获屏幕帧 img = pyautogui.screenshot() frame = np.array(img) frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 写入缓存队列,不直接写视频 frame_cache.append(frame) cv2.imshow('Live', frame) key = cv2.waitKey(1) # 按q退出程序 if key == ord('q'): break # 按s触发保存,把当前缓存的最近30秒帧写入视频 if key == ord('s'): # 生成带时间戳的文件名,避免覆盖 filename = f"Recording_{datetime.now().strftime('%Y%m%d_%H%M%S')}.avi" out = cv2.VideoWriter(filename, codec, fps, resolution) # 把缓存里的所有帧写入视频 for f in frame_cache: out.write(f) out.release() print(f"最近{CACHE_DURATION_SEC}秒画面已保存为:{filename}") cv2.destroyAllWindows()
使用说明
- 运行程序后会实时显示录屏预览,后台自动缓存最近30秒的画面
- 需要保存之前的画面时,按
s键即可生成视频文件,文件保存在程序运行目录 - 按
q键退出程序
优化建议
- pyautogui的截图性能较低,如果你需要更高帧率或者更高分辨率的录制,可以替换为mss库的截图接口,性能提升非常明显
- 如果觉得缓存30秒占用内存过高,可以调低分辨率或者缓存时长,1080p30帧缓存30秒大概占用2-3G内存,属于正常范围
内容的提问来源于stack exchange,提问作者Shashankh_
相关产品推荐
相关产品推荐

