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

如何使用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_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:54:06