Python实现屏幕录制工具:基于PIL与OpenCV的完整方案

Chloe
Chloe
发布时间:2026-10-15| 5人浏览过
原创

本文介绍如何使用Python结合PIL的ImageGrab模块与OpenCV库,实现一个轻量级的屏幕录制工具。通过多线程处理屏幕抓取与视频流写入,并利用pynput库监听ESC键终止录制,最终生成包含帧率、分辨率及时长信息的AVI视频文件。

由于女友从事软件测试工作,日常需频繁录屏以记录操作过程,便于开发人员后续排查问题。面对市面上多数录屏软件收费高昂且频繁更替的困境,我决定利用Python的灵活性为其开发一款专属工具,以解决这一痛点。

思路

经调研发现,主流的视频录制方案多依赖图像处理库PIL中的ImageGrab模块。该模块能够将当前屏幕画面或剪贴板内容捕获至PIL图像内存中。基于此原理,若持续不间断地获取屏幕图像并将序列帧拼接,即可构成视频流。

实现

录制

核心逻辑在于利用PIL模块中的ImageGrab持续捕获屏幕画面,随后调用OpenCV将图像数据写入视频流。

def video_record(sttime):
    global name
    # 当前的时间(当文件名)
    name = datetime.now().strftime('%Y-%m-%d %H-%M-%S')
    # 获取当前屏幕
    screen = ImageGrab.grab()
    # 获取当前屏幕的大小
    width, high = screen.size
    # MPEG-4编码,文件后缀可为.avi .asf .mov等
    fourcc = VideoWriter_fourcc('X', 'V', 'I', 'D')
    # (文件名,编码器,帧率,视频宽高)
    video = VideoWriter('%s.avi' % name, fourcc, 15, (width, high))
    print(str(sttime) + '秒后开始录制----')
    time.sleep(int(sttime))
    print('开始录制!')
    global start_time
    start_time = time.time()
    while True:
        if flag:
            print("录制结束!")
            global final_time
            final_time = time.time()
            # 释放
            video.release()
            break
        # 图片为RGB模式
        im = ImageGrab.grab()
        # 转为opencv的BGR模式
        imm = cvtColor(np.array(im), COLOR_RGB2BGR)
        # 写入
        video.write(imm)

虽然录制视频的核心代码仅数行,但需对录制过程进行有效控制,包括启动与停止录制等功能。此外,获取屏幕图像后,还需进行格式转码并写入视频流。

监听键盘事件

视频录制依赖while循环持续获取屏幕信息,该过程一旦启动便持续运行。因此,必须监听键盘事件以终止循环,进而结束录制。此处选用功能强大的第三方库pynput,它支持全局监听键盘与鼠标事件。

设定当用户按下ESC键时,触发终止while循环的逻辑,从而结束视频录制过程。

# 监听按键
def on_press(key):
    global flag
    if key == keyboard.Key.esc:
        flag = True
        # 返回False,键盘监听结束!
        return False

主体控制

鉴于需持续获取屏幕内容,建议启动独立线程执行此任务,以避免阻塞主程序。

th = threading.Thread(target=video_record, args=sstime)
    th.start()
    with keyboard.Listener(on_press=on_press) as listener:
        listener.join()

视频信息

录制结束后,可提取视频的关键元数据,包括视频时长、帧率及分辨率等信息。

# 视频信息
def video_info():
    # 记得文件名加格式不要错!
    video = VideoCapture('%s.avi' % name)
    fps = video.get(CAP_PROP_FPS)
    count = video.get(CAP_PROP_FRAME_COUNT)
    size = (int(video.get(CAP_PROP_FRAME_WIDTH)), int(video.get(CAP_PROP_FRAME_HEIGHT)))
    print('帧率=%.1f' % fps)
    print('帧数=%.1f' % count)
    print('分辨率', size)
    print('视频时间=%.3f秒' % (int(count) / fps))
    print('录制时间=%.3f秒' % (final_time - start_time))
    print('推荐帧率=%.2f' % (fps * ((int(count) / fps) / (final_time - start_time))))

至此,关于Python实现屏幕录制工具的示例介绍完毕。如需了解更多Python屏幕录制相关内容,可查阅本站过往文章或继续浏览后续教程,感谢支持。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。