一、引言
在当今数字化时代,屏幕录制已成为教学、游戏直播、软件演示等领域的核心需求。Python凭借其丰富的第三方库和简洁的语法,为开发者提供了快速构建录屏工具的可能性。本文ZHANID工具网将通过实例代码,详细解析如何使用Python开发一个功能完善的电脑录屏工具,涵盖基础功能实现、高级功能扩展及性能优化策略。
二、核心依赖库解析
(一)OpenCV(cv2)
OpenCV是计算机视觉领域的核心库,其VideoWriter类是视频录制的基石。通过VideoWriter_fourcc可指定编码器(如XVID、mp4v),结合帧率与分辨率参数,即可创建视频文件。例如:
fourcc = cv2.VideoWriter_fourcc(*"mp4v") # MP4编码器
out = cv2.VideoWriter("output.mp4", fourcc, 20.0, (1920, 1080))
此代码创建了一个20帧/秒、分辨率为1920×1080的MP4视频文件。
(二)PyAutoGUI与mss
-
PyAutoGUI:通过
screenshot()方法可快速截取全屏图像,但效率较低,适合简单场景。 -
mss:基于多线程的屏幕捕获库,性能显著优于PyAutoGUI。通过
sct.grab(monitor)可精确捕获指定区域,返回的图像为NumPy数组,可直接与OpenCV配合使用。
(三)NumPy
NumPy数组是OpenCV处理图像的标准格式。通过np.array()将PIL图像或mss捕获的图像转换为NumPy数组后,需使用cv2.cvtColor调整颜色空间(如BGR转RGB),以确保色彩正确显示。
三、基础录屏功能实现
(一)全屏录制代码示例
import cv2
import numpy as np
import mss
import time
def full_screen_record():
with mss.mss() as sct:
# 定义全屏区域
monitor = {"top": 0, "left": 0, "width": sct.monitors[1]["width"], "height": sct.monitors[1]["height"]}
# 创建视频文件
fourcc = cv2.VideoWriter_fourcc(*"mp4v")
output_path = f"full_screen_{int(time.time())}.mp4"
out = cv2.VideoWriter(output_path, fourcc, 20.0, (monitor["width"], monitor["height"]))
print(f"开始录制全屏,保存路径:{output_path}")
start_time = time.time()
try:
while True:
# 捕获屏幕
img = np.array(sct.grab(monitor))
img = cv2.cvtColor(img, cv2.COLOR_RGBA2BGR) # 转换颜色空间
# 写入视频
out.write(img)
# 按ESC键退出
if cv2.waitKey(1) == 27:
break
# 限制帧率(可选)
time.sleep(1/20)
finally:
out.release()
print(f"录制结束,耗时:{time.time() - start_time:.2f}秒")
if __name__ == "__main__":
full_screen_record()
(二)代码解析
-
区域定义:通过
sct.monitors[1]获取主显示器分辨率,确保全屏捕获。 -
视频编码:使用MP4格式(mp4v编码器),兼顾兼容性与文件体积。
-
实时捕获:
sct.grab(monitor)返回的图像为RGBA格式,需转换为BGR以适配OpenCV。 -
退出机制:通过
cv2.waitKey(1)监听ESC键,实现用户友好退出。
四、高级功能扩展
(一)自定义录制区域
通过交互式界面或参数配置,允许用户指定录制区域。示例代码:
def select_record_area():
import tkinter as tk
from tkinter import simpledialog
root = tk.Tk()
root.withdraw() # 隐藏主窗口
# 输入区域坐标
x1 = simpledialog.askinteger("输入", "左上角X坐标")
y1 = simpledialog.askinteger("输入", "左上角Y坐标")
x2 = simpledialog.askinteger("输入", "右下角X坐标")
y2 = simpledialog.askinteger("输入", "右下角Y坐标")
return {"top": y1, "left": x1, "width": x2 - x1, "height": y2 - y1}
# 使用示例
monitor = select_record_area()
(二)添加水印与时间戳
在每帧图像上叠加文字或Logo,增强版权保护:
def add_watermark(frame, text="Sample Watermark"): cv2.putText(frame, text, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2) return frame # 在录制循环中调用 img = np.array(sct.grab(monitor)) img = cv2.cvtColor(img, cv2.COLOR_RGBA2BGR) img = add_watermark(img) # 添加水印 out.write(img)
(三)多线程优化
为避免UI冻结,将屏幕捕获与视频写入分离至不同线程:
import threading import queue def capture_thread(sct, monitor, frame_queue): while True: img = np.array(sct.grab(monitor)) img = cv2.cvtColor(img, cv2.COLOR_RGBA2BGR) frame_queue.put(img) if cv2.waitKey(1) == 27: # 退出条件 break def write_thread(frame_queue, out): while True: frame = frame_queue.get() if frame is None: # 终止信号 break out.write(frame) # 使用示例 frame_queue = queue.Queue(maxsize=10) capture_t = threading.Thread(target=capture_thread, args=(sct, monitor, frame_queue)) write_t = threading.Thread(target=write_thread, args=(frame_queue, out)) capture_t.start() write_t.start()

五、性能优化策略
(一)编码器选择
-
MP4(H.264):推荐使用
mp4v或H264编码器,平衡压缩率与兼容性。 -
分辨率与帧率:降低分辨率(如1280×720)或帧率(如15fps)可显著减小文件体积。
(二)资源释放
-
显式释放:在
finally块中调用out.release(),确保文件完整写入。 -
内存管理:限制队列大小(如
maxsize=10),避免内存溢出。
(三)错误处理
-
权限问题:检查录制目录的写入权限。
-
编码器兼容性:捕获
cv2.error异常,提供友好的错误提示。
六、完整实例代码
import cv2
import numpy as np
import mss
import time
import threading
import queue
def add_watermark(frame, text="Sample Watermark"):
cv2.putText(frame, text, (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)
return frame
def capture_thread(sct, monitor, frame_queue):
try:
while True:
img = np.array(sct.grab(monitor))
img = cv2.cvtColor(img, cv2.COLOR_RGBA2BGR)
img = add_watermark(img)
frame_queue.put(img)
if cv2.waitKey(1) == 27:
break
except Exception as e:
print(f"捕获线程错误: {e}")
finally:
frame_queue.put(None) # 发送终止信号
def write_thread(frame_queue, output_path, width, height):
fourcc = cv2.VideoWriter_fourcc(*"mp4v")
out = cv2.VideoWriter(output_path, fourcc, 20.0, (width, height))
try:
while True:
frame = frame_queue.get()
if frame is None:
break
out.write(frame)
except Exception as e:
print(f"写入线程错误: {e}")
finally:
out.release()
print(f"视频已保存至: {output_path}")
def main():
with mss.mss() as sct:
# 全屏或自定义区域
monitor = {"top": 0, "left": 0, "width": 1920, "height": 1080} # 示例:全屏
# 创建队列与线程
frame_queue = queue.Queue(maxsize=10)
output_path = f"screen_record_{int(time.time())}.mp4"
capture_t = threading.Thread(target=capture_thread, args=(sct, monitor, frame_queue))
write_t = threading.Thread(target=write_thread, args=(frame_queue, output_path, monitor["width"], monitor["height"]))
print(f"开始录制,保存路径:{output_path}")
start_time = time.time()
capture_t.start()
write_t.start()
capture_t.join()
write_t.join()
print(f"录制结束,耗时:{time.time() - start_time:.2f}秒")
if __name__ == "__main__":
main()
七、总结
本文通过实例代码详细解析了Python录屏工具的开发流程,涵盖基础功能实现、高级功能扩展及性能优化策略。关键点包括:
-
核心库选择:OpenCV负责视频编码,mss提供高效屏幕捕获。
-
多线程架构:分离捕获与写入逻辑,提升响应速度。
-
用户体验优化:支持自定义区域、水印添加及错误处理。
未来可进一步探索音频录制、实时压缩及跨平台兼容性(如使用PyQt构建GUI界面)。Python的灵活性使得录屏工具的开发门槛大幅降低,开发者可根据需求快速迭代功能。

王子主页


















