一、技术背景
import cv2 # 视频编码/写入/实时预览 :ml-citation{ref="2,3" data="citationList"}
import numpy as np # 图像数据格式转换 (PIL.Image 转 OpenCV 矩阵) :ml-citation{ref="2,5" data="citationList"}
import pyautogui # 屏幕截图捕获 (支持全屏/区域截取) :ml-citation{ref="1,3" data="citationList"}
import time # 控制录制帧率间隔 :ml-citation{ref="2,7" data="citationList"}
from datetime import datetime # 生成时间戳文件名 (避免重复覆盖) :ml-citation{ref="7" data="citationList"}
import keyboard # 监听键盘事件 (如按 Q 键终止录制) :ml-citation{ref="7" data="citationList"}
二、基础功能逻辑
1. 分辨率获取
pyautogui.size() 动态适配当前屏幕尺寸 23
2. 视频编码配置
使用 cv2.VideoWriter_fourcc(*"XVID") 定义 MPEG-4 编码格式,平衡文件大小与画质 24
3. 循环捕获流程
while True:
# 屏幕截图 -> 格式转换 -> 写入视频流 :ml-citation{ref="4,5" data="citationList"}
img = pyautogui.screenshot()
frame = np.array(img)
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
out.write(frame)
# 检测终止按键 (如 Q)
if keyboard.is_pressed('q'): break :ml-citation{ref="7" data="citationList"}
4. 资源释放
录制结束后必须执行 out.release()
和 cv2.destroyAllWindows()
防止内存泄漏
三、完整代码
import cv2
import numpy as np
import pyautogui
import time
from datetime import datetime
import keyboard # 新增输入检测库
def screen_record(output_file="output.avi", fps=15, resolution=None, codec='XVID'):
"""
改进版屏幕录制函数(无界面模式)
"""
if resolution is None:
screen_size = pyautogui.size()
resolution = (screen_size.width, screen_size.height)
fourcc = cv2.VideoWriter_fourcc(*codec)
out = cv2.VideoWriter(output_file, fourcc, fps, resolution)
print("开始录制,按 'q' 停止...")
start_time = time.time()
try:
while True:
img = pyautogui.screenshot()
frame = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
out.write(frame)
# 显示录制时间
elapsed = time.time() - start_time
print(f"\r正在录制:{elapsed:.1f} 秒", end="")
if keyboard.is_pressed('q'):
print("\n正在停止录制...")
break
finally:
out.release()
print(f"录制已保存至 {output_file}")
if __name__ == "__main__":
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"screen_record_{timestamp}.avi"
screen_record(
output_file=filename,
fps=30,
codec='MJPG'
)