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 相关文章推荐
java直接调用python脚本的例子
Feb 16 Python
python定时器使用示例分享
Feb 16 Python
python批量生成本地ip地址的方法
Mar 23 Python
Python+Selenium自动化实现分页(pagination)处理
Mar 31 Python
python数字图像处理之高级滤波代码详解
Nov 23 Python
Python3.5 创建文件的简单实例
Apr 26 Python
Python 中包/模块的 `import` 操作代码
Apr 22 Python
使用TensorFlow实现简单线性回归模型
Jul 19 Python
pytorch制作自己的LMDB数据操作示例
Dec 18 Python
使用Pycharm分段执行代码
Apr 15 Python
ITK 实现多张图像转成单个nii.gz或mha文件案例
Jul 01 Python
Python绘制散点图之可视化神器pyecharts
Jul 07 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面向对象全攻略 (十二) 抽象方法和抽象类
2009/09/30 PHP
对text数据类型不支持代码页转换 从: 1252 到: 936
2011/04/23 PHP
php微信公众平台开发类实例
2015/04/01 PHP
通过源码解析Laravel的依赖注入
2018/01/22 PHP
php微信公众号开发之二级菜单
2018/10/20 PHP
PHP大文件分片上传的实现方法
2018/10/28 PHP
使用PHP开发留言板功能
2019/11/19 PHP
游戏人文件夹程序 ver 4.03
2006/07/14 Javascript
top.location.href 没有权限 解决方法
2008/08/05 Javascript
jqPlot 基于jquery的画图插件
2011/04/26 Javascript
js 代码优化点滴记录
2012/02/19 Javascript
jQuery.query.js 取参数的两点问题分析
2012/08/06 Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
2014/12/31 Javascript
兼容Firefox的Javascript XSLT 处理XML文件
2014/12/31 Javascript
在小程序中使用Echart图表的示例代码
2018/08/02 Javascript
layui的layedit富文本赋值方法
2019/09/18 Javascript
40行代码把Vue3的响应式集成进React做状态管理
2020/05/20 Javascript
JavaScript浅层克隆与深度克隆示例详解
2020/09/01 Javascript
[03:17]2014DOTA2 国际邀请赛中国区预选赛 四强专访
2014/05/23 DOTA
用Python实现一个简单的线程池
2015/04/07 Python
python利用requests库进行接口测试的方法详解
2018/07/06 Python
解决python给列表里添加字典时被最后一个覆盖的问题
2019/01/21 Python
Python中函数的返回值示例浅析
2019/08/28 Python
python3+openCV 获取图片中文本区域的最小外接矩形实例
2020/06/02 Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
2020/06/29 Python
Python文件夹批处理操作代码实例
2020/07/21 Python
如何通过安装HomeBrew来安装Python3
2020/12/23 Python
Topshop美国官网:英国快速时尚品牌
2019/05/16 全球购物
荷兰照明、灯具和配件网上商店:dmlights
2019/08/25 全球购物
圣诞树世界:Christmas Tree World
2019/12/10 全球购物
八项规定对照检查材料
2014/08/31 职场文书
上班迟到检讨书300字
2014/10/18 职场文书
专业技术人员年度考核评语
2014/12/31 职场文书
JS创建或填充任意长度数组的小技巧汇总
2021/10/24 Javascript
MySQL之MyISAM存储引擎的非聚簇索引详解
2022/03/03 MySQL
Win10多屏显示如何设置?Win10电脑多屏显示设置操作方法
2022/07/07 数码科技