Python做屏幕录制工具的实现示例
作者:编程学习网 发布时间:2021-06-17 09:29:23
标签:Python,屏幕录制
女朋友是一个软件测试人员,在工作中经常会遇到需要录屏记录自己操作,方便后续开发同学定位。因为录屏软件动不动就开始收费,所以她经常更换录屏软件。闲暇之余,我就觉得手痒,感觉可以用万能的 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))))
来源:https://juejin.cn/post/7105264248237850661
0
投稿
猜你喜欢
- 获取指定日期月份的第一天,你可以使用DATEADD函数,减去指定日期的月份过去了的天数,即可。 代码如下:CREATE FUNC
- 在编程时你一定碰到过时间触发的事件,在VB中有timer控件,而asp中没有,假如你要不停地查询数据库来等待一个返回结果的话,我想你一定知道
- Python提取html中文本到txt正则去标签方式# -*- coding: utf-8 -*-import redef html_tag
- 目录1 请求和响应1.1 请求1.2 响应2 视图2.1 基于APIView写接口2.2 基于GenericAPIView写的接口2.3 基
- (1)选择最有效率的表名顺序(只在基于规则的优化器中有效):Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写
- 1. python函数1.1 函数的作用函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码段函数能提高应用的模块性和代码的重复利用
- 今天在安装SQL2005开发版时遇到了这样的一个问题:选择的功能中没有任何功能可以安装或升级,这是怎么回事呀?我已经选择了相应的组件,怎么还
- 相信大家都知道jQuery是最优秀的Javascript框架之一。以其语法简单灵活而大受Web designer欢迎。所以很多网页设计师结合
- 本文实例讲述了mysql 定时任务的实现与使用方法。分享给大家供大家参考,具体如下:mysql5.1.6增加了一个事件调度器(Event S
- 1、仅 Safari 和 Opera 识别的 Hack@media all and (min-width:&n
- 在树莓派自带得python IDE Thonny中写如下代码,并在树莓派上插上usb摄像头import cv2cap=cv2.VideoCa
- MSSQL2005数据库版本 SQL Server 2005 的各版本之间选择 大多数企业都在三个 SQL Ser
- 今天有朋友问到如下一则案例,ORA-01114,ORA-27067以及OSD-04026错误同时出现:*** ACTION NAME:()
- 概述np.ones()函数返回给定形状和数据类型的新数组,其中元素的值设置为1。此函数与numpy zeros()函数非常相似。用法np.o
- 其主要的优点便是无需再手工添加大量的信息了,可以指定对某一个站信息的截取进行批量录入,达到省时省力的目的。与其单纯的ASP小偷程序不同的是:
- 本文实例为大家分享了JS实现拖动模糊框特效的具体代码,供大家参考,具体内容如下需求:在图片上拖动按钮,图片蒙层慢慢覆盖,当蒙层边缘碰到左右下
- 本文实例讲述了python编程开发之类型转换convert。分享给大家供大家参考,具体如下:在python的开发过程中,难免会遇到类型转换,
- 实例如下所示:# -*- coding: UTF-8 -*-from urllib import requestif __name__ ==
- 注:本文所说的视觉设计师专指网页视觉设计师。网页设计师与平面设计师都归类为设计师,其实这两个职业是跨行业的,虽然有很多设计师一直在跨行业工作
- 本教程为大家分享了Ubuntu手动安装mysql5.7.10的过程,供大家参考,具体内容如下1、下载安装包MySQL官网下载地址选择系统版本