在Python中,我们可以借助多个强大的库来实现丰富的功能,比如屏幕录制和键盘监听。今天,我们将通过结合PIL(Python Imaging Library的分支Pillow)、OpenCV、pynput以及threading等库,来实现一个简单的屏幕录制工具,该工具能够通过监听键盘事件来控制录制的开始与结束。
导入所需库
1 2 3 4 5 6 7 8 |
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 |
定义视频录制函数
1 2 3 4 5 6 7 8 9 |
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,则停止录制并释放视频写入对象。
定义键盘监听函数
1 2 3 4 5 |
def on_press(key): global flag if key == keyboard.Key.esc: flag = True return False |
这个函数会监听键盘事件,当按下esc键时,将全局变量flag设置为True,并返回False以停止键盘监听。
定义视频信息打印函数
1 2 3 4 5 |
def video_info(): # ...(省略了部分代码) print('帧率=%.1f' % fps) # ...(省略了部分代码) print('推荐帧率=%.2f' % (fps*((int(count)/fps)/(final_time-start_time)))) |
这个函数会在录制结束后读取视频文件的信息,包括帧率、帧数、分辨率以及录制时间等,并打印出来。同时,它还会计算并打印一个推荐帧率,这个推荐帧率是基于实际录制时间与视频文件中的帧数计算得出的。
主函数
1 2 3 4 5 6 7 8 9 10 |
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() |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
#!/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来实现屏幕录制与键盘监听功能。