python实现录屏功能(亲测好用)


Posted in Python onMarch 02, 2020

前言

由与上不了学,教我们Mastercam的老师提前给我们布置了4道习题。对我们太好了,谢谢老师

python实现录屏功能(亲测好用)

没办法,干就完了。

只是要求附上制作过程视频,就想到了能不能用python做个录屏的程序,于是在网上看了好多文章,发现很多都不是很好用,要不就是太麻烦(我就录个屏,不用声音,也不用控件)。最后看到了一个符合我要求的,可以去看看这里(感谢!)

不过呢,俗话说:适合自己的才是最好的。当我们用的时候,会发现录制的时间和视频播放的时间不一致,有的快了,有的慢了,所以就想出了原因与解决办法。接下来先上代码吧

需要安装的第三方库有pillow、opencv-python、numpy、pynput

上‘马'

import time,threading
from datetime import datetime
from PIL import ImageGrab
from cv2 import *
import numpy as np
from pynput import keyboard
def video_record():   # 录入视频
  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)) # (文件名,编码器,帧率,视频宽高)
  #print('3秒后开始录制----')  # 可选
  #time.sleep(3)
  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秒再次循环
def on_press(key):   # 监听按键
  global flag
  if key == keyboard.Key.home:
    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()

解决

观察代码可以发现实现录屏的方式就是不断循环获取屏幕然后写入,可以想到每循环一次就是一帧,而循环一次要多长时间就取决于运行的速度了。所以我们只要让一秒中写入的帧数(也就是1秒中循环的次数)和video中的参数帧率相等,就能获得差不多正常的速度

因此我在代码中加入了视频信息,算出了视频播放的时间和录制时间,再推算出来正常速度的帧率?推荐帧率。只要先运行试一下,看一下推荐帧率是多少,再把代码中的参数改过来就行了(要取整数哦)

python实现录屏功能(亲测好用)

要按home键来正常结束程序,才会有video_info出现

然后呢!我发现老师要我们附制造过程视频,我TM也不可能发个几个几百M甚至上G的视频过去吧,老师也没时间去看吧

于是乎,我在循环中加入了‘等待5秒',这样就差不多每5秒获取1帧,推荐帧率显示0.20,当然,我不能也不会按这个速度播放,给它来个25倍(帧率为0.20*25=5,这样视频出来就又小又短了?)

多提一下,因为两个线程并不会同时结束,只是通过flag这个变量改变来使得另一个结束,所以按home键flag改变的时候,另一个线程video_record还处于运行循环中,因此我们要等它经过这次循环,进入下一次条件判断,视频才得以从内存释放…呃嗯,就是我要在代码倒数第2行那里等待个5+1=6秒(这样比较保险),否则的话,那个帧数会显示为0,甚至会出现运行错误(不能除0)

说了那么多,怎么能不给你们看一下效果呢

成果

4题,录了4个,最小的不到4M,最大也就14M多点?

python实现录屏功能(亲测好用)

因为这里放不了AVI,所以我把最小的那个转成GIF格式放给你们看看。
不过模糊了好多,还多了一些莫名的××点点?

python实现录屏功能(亲测好用)

最后

python实现录屏功能(亲测好用)

总结

到此这篇关于python实现录屏功能(亲测好用)的文章就介绍到这了,更多相关python 实现录屏内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python实现simhash算法实例
Apr 25 Python
python数据处理实战(必看篇)
Jun 11 Python
python 简单搭建阻塞式单进程,多进程,多线程服务的实例
Nov 01 Python
python自动发送邮件脚本
Jun 20 Python
利用python打开摄像头及颜色检测方法
Aug 03 Python
python虚拟环境迁移方法
Jan 03 Python
python飞机大战pygame碰撞检测实现方法分析
Dec 17 Python
python时间与Unix时间戳相互转换方法详解
Feb 13 Python
Python装饰器实现方法及应用场景详解
Mar 26 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
Apr 08 Python
Python测试框架:pytest学习笔记
Oct 20 Python
Python Web项目Cherrypy使用方法镜像
Nov 05 Python
基于Numba提高python运行效率过程解析
Mar 02 #Python
Python3 assert断言实现原理解析
Mar 02 #Python
Django认证系统user对象实现过程解析
Mar 02 #Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
Mar 02 #Python
Python基于requests库爬取网站信息
Mar 02 #Python
使用python3 实现插入数据到mysql
Mar 02 #Python
python数字类型math库原理解析
Mar 02 #Python
You might like
浅析PHP原理之变量(Variables inside PHP)
2013/08/09 PHP
Thinkphp3.2实用篇之计算型验证码示例
2017/02/09 PHP
php+ajax实现仿百度查询下拉内容功能示例
2017/10/20 PHP
laravel项目利用twemproxy部署redis集群的完整步骤
2018/05/11 PHP
javascript实现的鼠标链接提示效果生成器代码
2007/06/28 Javascript
firefox浏览器下javascript 拖动层效果与原理分析代码
2007/12/04 Javascript
JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型
2012/10/11 Javascript
js操纵跨frame的三级联动select下拉选项实例介绍
2013/05/19 Javascript
用JavaScript计算在UTF-8下存储字符串占用字节数
2013/08/08 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
2013/09/02 Javascript
javascript实现的DES加密示例
2013/10/30 Javascript
Jquery获取元素的父容器对象示例代码
2014/02/10 Javascript
js 显示base64编码的二进制流网页图片
2014/04/04 Javascript
ExtJS4 表格的嵌套 rowExpander应用
2014/05/02 Javascript
浅谈nodeName,nodeValue,nodeType,typeof 的区别
2015/01/13 Javascript
JavaScript中的条件判断语句使用详解
2015/06/03 Javascript
javascript+css3 实现动态按钮菜单特效
2016/02/06 Javascript
字太多用...代替的方法(两种)
2017/03/15 Javascript
如何在Vue.js中实现标签页组件详解
2019/01/02 Javascript
JavaScript实现与使用发布/订阅模式详解
2019/01/19 Javascript
通过高德地图API获得某条道路上的所有坐标用于描绘道路的方法
2020/08/24 Javascript
详解Python中break语句的用法
2015/05/14 Python
用python写个自动SSH登录远程服务器的小工具(实例)
2017/06/17 Python
Jupyter notebook远程访问服务器的方法
2018/05/24 Python
django 做 migrate 时 表已存在的处理方法
2019/08/31 Python
python图形开发GUI库wxpython使用方法详解
2020/02/14 Python
利用Python实现学生信息管理系统的完整实例
2020/12/30 Python
CSS3 transform的skew属性值图文详解
2014/07/21 HTML / CSS
CSS3实现千变万化的文字阴影text-shadow效果设计
2016/04/26 HTML / CSS
开工仪式策划方案
2014/05/23 职场文书
师德师风剖析材料
2014/09/30 职场文书
2014年底工作总结
2014/12/15 职场文书
2015年导购员工作总结
2015/04/25 职场文书
公司考勤管理制度
2015/08/04 职场文书
小学生法制教育心得体会
2016/01/14 职场文书
前端与RabbitMQ实时消息推送未读消息小红点实现示例
2022/07/23 Java/Android