使用Python实现屏幕录制与键盘监听功能

 更新时间:2024年12月26日 10:49:26   作者:Leuanghing  
在Python中,我们可以借助多个强大的库来实现丰富的功能,比如屏幕录制和键盘监听,今天,我们将通过结合PIL、OpenCV、pynput以及threading等库,来实现一个简单的屏幕录制工具,该工具能够通过监听键盘事件来控制录制的开始与结束,需要的朋友可以参考下

一、引言

在Python中,我们可以借助多个强大的库来实现丰富的功能,比如屏幕录制和键盘监听。今天,我们将通过结合PIL(Python Imaging Library的分支Pillow)、OpenCV、pynput以及threading等库,来实现一个简单的屏幕录制工具,该工具能够通过监听键盘事件来控制录制的开始与结束。

二、所需库介绍

  • PIL(Pillow):用于屏幕截图。
  • OpenCV:用于视频文件的创建与写入。
  • pynput:用于监听键盘事件。
  • threading:用于并行执行代码,实现屏幕录制与键盘监听的同时进行。

三、代码详解

导入所需库

import time
import threading
from datetime import datetime
from PIL import ImageGrab
import numpy as np
from cv2.cv2 import cvtColor, VideoWriter_fourcc, VideoWriter, COLOR_RGB2BGR, VideoCapture, \
                  CAP_PROP_FPS, CAP_PROP_FRAME_COUNT, CAP_PROP_FRAME_WIDTH, CAP_PROP_FRAME_HEIGHT
from pynput import keyboard

定义视频录制函数

def video_record():
    # ...(省略了部分代码)
    while True:
        if flag:
            # ...(省略了部分代码)
            break
        im = ImageGrab.grab()  # 截图
        imm = cvtColor(np.array(im), COLOR_RGB2BGR)  # 转换颜色模式
        video.write(imm)  # 写入视频文件
  • 这个函数首先获取当前时间作为文件名,然后初始化视频写入对象。接着,它会显示一个3秒的倒计时,之后开始录制屏幕。在录制过程中,它会不断检查一个全局变量flag,如果flag变为True,则停止录制并释放视频写入对象。

定义键盘监听函数

def on_press(key):
    global flag
    if key == keyboard.Key.esc:
        flag = True
        return False
  • 这个函数会监听键盘事件,当按下esc键时,将全局变量flag设置为True,并返回False以停止键盘监听。

定义视频信息打印函数

def video_info():
    # ...(省略了部分代码)
    print('帧率=%.1f' % fps)
    # ...(省略了部分代码)
    print('推荐帧率=%.2f' % (fps*((int(count)/fps)/(final_time-start_time))))
  • 这个函数会在录制结束后读取视频文件的信息,包括帧率、帧数、分辨率以及录制时间等,并打印出来。同时,它还会计算并打印一个推荐帧率,这个推荐帧率是基于实际录制时间与视频文件中的帧数计算得出的。

主函数

if __name__ == '__main__':
    flag = False
    th = threading.Thread(target=video_record)
    th.start()

    with keyboard.Listener(on_press=on_press) as listener:
        listener.join()

    time.sleep(1)  # 等待视频释放过后
    video_info()
  • 在主函数中,我们首先初始化全局变量flag为False,然后创建一个线程来运行video_record函数。接着,我们使用pynput库的keyboard.Listener来监听键盘事件,并将on_press函数作为回调函数。当键盘监听结束时(即按下esc键后),主线程会等待1秒以确保视频文件被正确释放,然后调用video_info函数来打印视频信息。

四、完整代码

#!/usr/bin/env python
# -*- coding = utf-8 -*-
# @Time : 2021/10/6 17:43
# @Author : Leuanghing Chen
# @Blog : https://blog.csdn.net/weixin_46153372?spm=1010.2135.3001.5421
# @File : python实现录屏功能.py
# @Software : PyCharm
# 发布程序:pyinstaller -F -w -i F:\python_demo\2.ico F:\python_demo\python实现录屏功能.py

import time
import threading
from datetime import datetime
from PIL import ImageGrab
import numpy as np
from cv2.cv2 import cvtColor, VideoWriter_fourcc, VideoWriter, COLOR_RGB2BGR, VideoCapture,\
                    CAP_PROP_FPS, CAP_PROP_FRAME_COUNT, CAP_PROP_FRAME_WIDTH, CAP_PROP_FRAME_HEIGHT
from pynput import keyboard


# 录入视频
def video_record():
    # 加了global,则可以在函数内部对函数外的对象进行操作了,也可以改变它的值了
    global name
    name = datetime.now().strftime('%Y-%m-%d %H-%M-%S')               # 当前的时间(当文件名)
    screen = ImageGrab.grab()                                         # 获取当前屏幕
    width, high = screen.size                                         # 获取当前屏幕的大小
    fourcc = VideoWriter_fourcc('X', 'V', 'I', 'D')                   # MPEG-4编码,文件后缀可为.avi .asf .mov等
    video = VideoWriter('%s.avi' % name, fourcc, 15, (width, high))   # (文件名,编码器,帧率,视频宽高)
    for i in range(3):
        time.sleep(1)
        print("倒计时:{}".format(3-i))
    print('开始录制!')
    global start_time
    start_time = time.time()

    while True:
        if flag:
            print("录制结束!")
            global final_time
            final_time = time.time()
            video.release()                                     # 释放
            break
        im = ImageGrab.grab()  # 图片为RGB模式
        imm = cvtColor(np.array(im), COLOR_RGB2BGR)             # 转为opencv的BGR模式
        video.write(imm)                                        # 写入
        # time.sleep(5)                                         # 等待5秒再次循环


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


# 视频信息
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))))


if __name__ == '__main__':
    flag = False
    th = threading.Thread(target=video_record)
    th.start()

    with keyboard.Listener(on_press=on_press) as listener:
        listener.join()

    time.sleep(1)  # 等待视频释放过后
    video_info()

五、总结

通过结合多个Python库,我们实现了一个简单的屏幕录制工具,该工具能够实时录制屏幕并通过监听键盘事件来控制录制的开始与结束。这个工具不仅可以用于个人娱乐或学习,还可以作为开发屏幕录制功能应用程序的基础。希望这篇博文能帮助你更好地理解如何使用Python来实现屏幕录制与键盘监听功能。

以上就是使用Python实现屏幕录制与键盘监听功能的详细内容,更多关于Python屏幕录制与键盘监听的资料请关注脚本之家其它相关文章!

相关文章

  • python PyQt5事件机制和定时器原理分析及用法详解

    python PyQt5事件机制和定时器原理分析及用法详解

    PyQt为事件处理提供了两种机制:高级的信号与槽机制,以及低级的事件处理机制,在基于PyQt5的应用程序开发过程中经常会遇到一些需要循环执行的任务,即定时多长时间任务循环一次,本文给大家介绍了python PyQt5事件机制和定时器原理和用法,需要的朋友可以参考下
    2024-07-07
  • Python3分析处理声音数据的例子

    Python3分析处理声音数据的例子

    今天小编就为大家分享一篇Python3分析处理声音数据的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • pandas 数据索引与选取的实现方法

    pandas 数据索引与选取的实现方法

    这篇文章主要介绍了pandas 数据索引与选取的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • 利用matplotlib为图片上添加触发事件进行交互

    利用matplotlib为图片上添加触发事件进行交互

    这篇文章主要介绍了利用matplotlib为图片上添加触发事件进行交互,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • python实现替换word中的关键文字(使用通配符)

    python实现替换word中的关键文字(使用通配符)

    今天小编就为大家分享一篇python实现替换word中的关键文字(使用通配符),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • Python异常学习笔记

    Python异常学习笔记

    这篇文章主要介绍了Python异常学习笔记,本文着重讲解了如何自定义一个异常,需要的朋友可以参考下
    2015-02-02
  • 基于Python的A*算法解决八数码问题实现步骤

    基于Python的A*算法解决八数码问题实现步骤

    这篇文章主要给大家介绍了关于如何基于Python的A*算法解决八数码问题的实现步骤,文中介绍了八数码问题及其求解方法,通过启发式搜索算法,特别是A*算法,可以有效地解决八数码问题,,需要的朋友可以参考下
    2024-11-11
  • Python爬取腾讯视频评论的思路详解

    Python爬取腾讯视频评论的思路详解

    这篇文章主要介绍了Python爬取腾讯视频评论功能,本文图文详解给大家提供实现思路,需要的朋友可以参考下
    2019-12-12
  • Python 字符串使用多个分隔符分割成列表的2种方法

    Python 字符串使用多个分隔符分割成列表的2种方法

    本文主要介绍了Python 字符串使用多个分隔符分割成列表,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 解决使用openpyxl时遇到的坑

    解决使用openpyxl时遇到的坑

    这篇文章主要介绍了解决使用openpyxl时遇到的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03

最新评论