Python实现屏幕录制功能的代码


Posted in Python onMarch 02, 2020

前段时间做视频时需要演示电脑端的操作,因此要用到屏幕录制,下载了个迅捷屏幕录制,但是没有vip录制的视频有水印且只能录制二分钟,于是鄙人想了下能不能通过万能的python来实现呢?经过一晚上的尝试发现这条路是可以走的通的。分享一下自己的想法,整体思路是PIL模块中的ImageGrab不停的获得当前屏幕,利用opencv写入视频流话不多说,直接上代码,有什么更好的建议,欢迎大家交流!

"""python + opencv 实现屏幕录制_by-_Zjh_"""
from PIL import ImageGrab
import numpy as np
import cv2
p = ImageGrab.grab()#获得当前屏幕
k=np.zeros((200,200),np.uint8)
a,b=p.size#获得当前屏幕的大小
fourcc = cv2.VideoWriter_fourcc(*'XVID')#编码格式
video = cv2.VideoWriter('test.avi', fourcc, 16, (a, b))#输出文件命名为test.mp4,帧率为16,可以自己设置
while True:
 im = ImageGrab.grab()
 imm=cv2.cvtColor(np.array(im), cv2.COLOR_RGB2BGR)#转为opencv的BGR格式
 video.write(imm)
 cv2.imshow('imm', k)
 if cv2.waitKey(1) & 0xFF == ord('q'):
  break
video.release()
cv2.destroyAllWindows()

在停止录制的时候我自己采用的是opencv的q键盘退出,实际上还是会有个黑框弹出来,如果有更好的退出录制方式请留下您的建议,本次还有个不足的地方是没有增加录制声音的功能。最近事情太多了,等放假了出一个完整版的GUI程序。好了今天就先到这了,快要考线性系统这门课了,得开始复习了

最近接触了 pynput 这个强大的三方库,可以全局监听键盘、鼠标事件。把以前的屏幕录制的程序改进一下!请忽略以前的程序,直接看这个!

"""
python 屏幕录制改进版,无opencv黑框显示!
@zhou 2020/1/29_
"""
from PIL import ImageGrab
import numpy as np
import cv2
import datetime
from pynput import keyboard
import threading
flag=False #停止标志位
def video_record():
 """
 屏幕录制!
 :return:
 """
 name = datetime.datetime.now().strftime('%Y-%m-%d %H-%M-%S') #当前的时间
 p = ImageGrab.grab() # 获得当前屏幕
 a, b = p.size # 获得当前屏幕的大小
 fourcc = cv2.VideoWriter_fourcc(*'XVID') # 编码格式
 video = cv2.VideoWriter('%s.avi'%name, fourcc, 20, (a, b)) # 输出文件命名为test.mp4,帧率为16,可以自己设置
 while True:
  im = ImageGrab.grab()
  imm=cv2.cvtColor(np.array(im), cv2.COLOR_RGB2BGR)#转为opencv的BGR格式
  video.write(imm)
  if flag:
   print("录制结束!")
   break
 video.release()
def on_press(key):
 """
 键盘监听事件!!!
 :param key:
 :return:
 """
 #print(key)
 global flag
 if key == keyboard.Key.esc:
  flag=True
  print("stop monitor!")
  return False #返回False,键盘监听结束!
if __name__=='__main__':
 th=threading.Thread(target=video_record)
 th.start()
 with keyboard.Listener(on_press=on_press) as listener:
  listener.join()

现在录制就不用之前那个黑框了,按 esc按键 直接停止录制!

PS:在通过代码给大家介绍下python 实现屏幕录制

PIL 即pollow 的安装命令如下:

pip install pillow

其中cv2的安装是下面这条命令

pip install opencv-python

代码实现:

# coding: utf-8
from PIL import ImageGrab
import numpy as np
import cv2
fps = 20
start = 3 # 延时录制
end = 15 # 自动结束时间
curScreen = ImageGrab.grab() # 获取屏幕对象
height, width = curScreen.size
video = cv2.VideoWriter('video02.avi', cv2.VideoWriter_fourcc(*'XVID'), fps, (height, width))
imageNum = 0
while True:
  imageNum += 1
  captureImage = ImageGrab.grab() # 抓取屏幕
  frame = cv2.cvtColor(np.array(captureImage), cv2.COLOR_RGB2BGR)
  # 显示无图像的窗口
  cv2.imshow('capturing', np.zeros((1, 255), np.uint8))
  # 控制窗口显示位置,方便通过按键方式退出
  cv2.moveWindow('capturing', height - 100, width - 100) 
  if imageNum > fps * start:
    video.write(frame)
  # 退出条件  
  if cv2.waitKey(50) == ord('q') or imageNum > fps * end:
    break
video.release()
cv2.destroyAllWindows()

总结

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

Python 相关文章推荐
Python Socket编程入门教程
Jul 11 Python
使用Python的Twisted框架编写简单的网络客户端
Apr 16 Python
Python使用minidom读写xml的方法
Jun 03 Python
如何优雅地处理Django中的favicon.ico图标详解
Jul 05 Python
解决pandas .to_excel不覆盖已有sheet的问题
Dec 10 Python
python scatter散点图用循环分类法加图例
Mar 19 Python
python中的列表与元组的使用
Aug 08 Python
python中提高pip install速度
Feb 14 Python
Python打包工具PyInstaller的安装与pycharm配置支持PyInstaller详细方法
Feb 27 Python
Python3如何实现Win10桌面自动切换
Aug 11 Python
python rsa-oaep加密的示例代码
Sep 23 Python
如何利用python读取micaps文件详解
Oct 18 Python
python实现录屏功能(亲测好用)
Mar 02 #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
You might like
php strcmp使用说明
2010/04/22 PHP
php url地址栏传中文乱码解决方法集合
2010/06/25 PHP
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
2013/05/07 PHP
ThinkPHP中关联查询实例
2014/12/02 PHP
PHP之浮点数计算比较以及取整数不准确的解决办法
2015/07/29 PHP
php语言中使用json的技巧及json的实现代码详解
2015/10/27 PHP
Yii 2中的load()和save()示例详解
2017/08/03 PHP
php表单处理操作
2017/11/16 PHP
js类后台管理菜单类-MenuSwitch
2007/09/12 Javascript
JQuery AJAX实现目录浏览与编辑的代码
2008/10/21 Javascript
JavaScript的parseInt 进制问题
2009/05/07 Javascript
基于jquery的表头固定的若干方法
2011/01/27 Javascript
使用insertAfter()方法在现有元素后添加一个新元素
2014/05/28 Javascript
JS实现闪动的title消息提醒效果
2014/06/20 Javascript
动态加载jQuery的方法
2015/06/16 Javascript
原生js实现可拖拽效果
2017/02/28 Javascript
JS实现的文字间歇循环滚动效果完整示例
2018/02/13 Javascript
微信小程序-form表单提交代码实例
2019/04/29 Javascript
微信小程序图表插件wx-charts用法实例详解
2019/05/20 Javascript
深入webpack打包原理及loader和plugin的实现
2020/05/06 Javascript
[02:41]DOTA2英雄基础教程 亚巴顿
2014/01/02 DOTA
本地文件上传到七牛云服务器示例(七牛云存储)
2014/01/11 Python
Python程序中用csv模块来操作csv文件的基本使用教程
2016/03/03 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
2018/02/13 Python
python实现远程通过网络邮件控制计算机重启或关机
2018/02/22 Python
python pandas 对时间序列文件处理的实例
2018/06/22 Python
解决Pycharm后台indexing导致不能run的问题
2019/06/27 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
2019/08/05 Python
django有哪些好处和优点
2020/09/01 Python
Django数据统计功能count()的使用
2020/11/30 Python
罗技美国官网:Logitech美国
2020/01/22 全球购物
在c#中using和new这两个关键字有什么意义
2013/05/19 面试题
趣味比赛活动方案
2014/02/15 职场文书
预备党员承诺书
2014/03/25 职场文书
会议主持词结束语
2015/07/03 职场文书
2019年健身俱乐部的创业计划书
2019/08/26 职场文书