Python做屏幕录制工具的实现示例

作者:编程学习网 时间:2021-06-17 09:29:23 

女朋友是一个软件测试人员,在工作中经常会遇到需要录屏记录自己操作,方便后续开发同学定位。因为录屏软件动不动就开始收费,所以她经常更换录屏软件。闲暇之余,我就觉得手痒,感觉可以用万能的 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

标签:Python,屏幕录制
0
投稿

猜你喜欢

  • 基于python实现数组格式参数加密计算

    2021-08-20 23:29:54
  • Python与人工神经网络:使用神经网络识别手写图像介绍

    2022-05-23 03:11:36
  • Python的动态重新封装的教程

    2023-08-23 15:26:39
  • Python实现我的世界小游戏源代码

    2023-07-26 02:09:08
  • SQLite3中文编码 Python的实现

    2023-02-03 13:21:38
  • php通过获取头信息判断图片类型的方法

    2023-11-10 00:31:50
  • python如何删除文件、目录

    2022-02-03 09:28:09
  • IE6,7下实现white-space:pre-wrap;

    2009-12-31 18:30:00
  • ASP.NET中使用SQL存储过程的方法

    2007-08-24 09:31:00
  • python循环定时中断执行某一段程序的实例

    2023-10-09 22:11:20
  • python 删除指定时间间隔之前的文件实例

    2023-07-19 17:58:38
  • Python爬取豆瓣视频信息代码实例

    2021-10-28 06:41:46
  • Oracle 11g安装错误提示未找到wfmlrsvcapp.ear的解决方法

    2023-07-14 14:31:52
  • 浅析Python 序列化与反序列化

    2023-05-01 14:36:16
  • ExecuteReader(),ExecuteNonQuery(),ExecuteScalar(),ExecuteXmlReader()之间的区别

    2023-07-08 23:15:54
  • JavaScript中实现字符串的取左取右(实现left和right功能)

    2009-07-20 12:39:00
  • python实现对服务器脚本敏感信息的加密解密功能

    2022-11-07 08:35:11
  • 学会python自动收发邮件 代替你问候女友

    2023-07-08 17:01:49
  • XMLHTTP 使用代理获取数据asp代码

    2010-03-22 14:40:00
  • Asp中通过简单的例子理解下ByVal和ByRef的用法

    2011-02-20 10:57:00
  • asp之家 网络编程 m.aspxhome.com