基于Python开发电脑录屏工具实例代码详解

原创 2025-06-27 10:13:07编程技术
461

一、引言

在当今数字化时代,屏幕录制已成为教学、游戏直播、软件演示等领域的核心需求。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()

(二)代码解析

  1. 区域定义:通过sct.monitors[1]获取主显示器分辨率,确保全屏捕获。

  2. 视频编码:使用MP4格式(mp4v编码器),兼顾兼容性与文件体积。

  3. 实时捕获sct.grab(monitor)返回的图像为RGBA格式,需转换为BGR以适配OpenCV。

  4. 退出机制:通过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()

电脑录屏工具.webp

五、性能优化策略

(一)编码器选择

  • MP4(H.264):推荐使用mp4vH264编码器,平衡压缩率与兼容性。

  • 分辨率与帧率:降低分辨率(如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录屏工具的开发流程,涵盖基础功能实现、高级功能扩展及性能优化策略。关键点包括:

  1. 核心库选择:OpenCV负责视频编码,mss提供高效屏幕捕获。

  2. 多线程架构:分离捕获与写入逻辑,提升响应速度。

  3. 用户体验优化:支持自定义区域、水印添加及错误处理。

未来可进一步探索音频录制、实时压缩及跨平台兼容性(如使用PyQt构建GUI界面)。Python的灵活性使得录屏工具的开发门槛大幅降低,开发者可根据需求快速迭代功能。

Python
THE END
战地网
频繁记录吧,生活的本意是开心

相关推荐

Python yield 用法大全:轻松掌握生成器与迭代器设计
在Python中,yield关键字是构建生成器的核心工具,它通过状态保存机制实现了高效的内存管理和惰性计算。与传统的迭代器实现相比,yield能将迭代器设计从复杂的类定义简化为直...
2025-09-15 编程技术
536

基于Python的旅游数据分析可视化系统【2026最新】
本研究成功开发了基于Python+Django+Vue+MySQL的旅游数据分析可视化系统,实现了从数据采集到可视化展示的全流程管理。系统采用前后端分离架构,前端通过Vue框架构建响应式界...
2025-09-13 编程技术
563

手把手教你用Python读取txt文件:从基础到实战的完整教程
Python作为数据处理的利器,文件读写是其基础核心功能。掌握txt文件读取不仅能处理日志、配置文件等常见场景,更是理解Python文件I/O的基石。本文ZHANID工具网将从基础语法到...
2025-09-12 编程技术
538

Python Flask 入门指南:从零开始搭建你的第一个 Web 应用
Flask作为 Python 中最轻量级且灵活的 Web 框架之一,特别适合初学者快速上手 Web 应用开发。本文将带你一步步了解如何在本地环境中安装 Flask、创建一个简单的 Web 应用,并...
2025-09-11 编程技术
527

Python 如何调用 MediaPipe?详细安装与使用指南
MediaPipe 是 Google 开发的跨平台机器学习框架,支持实时处理视觉、音频和文本数据。本文脚本之家将系统讲解 Python 环境下 MediaPipe 的安装、配置及核心功能调用方法,涵盖...
2025-09-10 编程技术
572

基于Python开发一个利率计算器的思路及示例代码
利率计算是金融领域的基础需求,涵盖贷款利息、存款收益、投资回报等场景。传统计算依赖手工公式或Excel表格,存在效率低、易出错等问题。Python凭借其简洁的语法和强大的数学...
2025-09-09 编程技术
510