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标准库之随机数 (math包、random包)介绍
Nov 25 Python
python3.5使用tkinter制作记事本
Jun 20 Python
Python实现将HTML转换成doc格式文件的方法示例
Nov 20 Python
python使用itchat库实现微信机器人(好友聊天、群聊天)
Jan 04 Python
python实现多人聊天室
Mar 31 Python
PyQT5 QTableView显示绑定数据的实例详解
Jun 25 Python
50行Python代码获取高考志愿信息的实现方法
Jul 23 Python
django多种支付、并发订单处理实例代码
Dec 13 Python
python 将dicom图片转换成jpg图片的实例
Jan 13 Python
python如何输出反斜杠
Jun 18 Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
Mar 04 Python
Python echarts实现数据可视化实例详解
Mar 03 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计算两个日期相差天数的方法
2015/03/14 PHP
PHP生成唯一订单号的方法汇总
2015/04/16 PHP
PHP中通过getopt解析GNU C风格命令行选项
2019/11/18 PHP
解决表单中第一个非隐藏的元素获得焦点的一个方案
2009/10/26 Javascript
jQuery获取Select选择的Text和Value(详细汇总)
2013/01/25 Javascript
VUEJS实战之构建基础并渲染出列表(1)
2016/06/13 Javascript
JavaScript事件详细讲解
2016/06/27 Javascript
基于JavaScript实现的折半查找算法示例
2017/04/14 Javascript
详解js静态资源文件请求的处理
2017/08/01 Javascript
EasyUI的TreeGrid的过滤功能的解决思路
2017/08/08 Javascript
Bootstrap Tooltip显示换行和左对齐的解决方案
2017/10/11 Javascript
利用vue + koa2 + mockjs模拟数据的方法教程
2017/11/22 Javascript
浅谈FastClick 填坑及源码解析
2018/03/02 Javascript
小程序实现订单倒计时功能
2019/04/23 Javascript
vue中beforeRouteLeave实现页面回退不刷新的示例代码
2019/11/01 Javascript
使用webpack搭建vue环境的教程详解
2019/12/31 Javascript
vue路由传参的基本实现方式小结【三种方式】
2020/02/05 Javascript
微信小程序中使用 async/await的方法实例分析
2020/05/06 Javascript
简单了解Vue computed属性及watch区别
2020/07/10 Javascript
python列表操作使用示例分享
2014/02/21 Python
利用python将图片转换成excel文档格式
2017/12/30 Python
Flask解决跨域的问题示例代码
2018/02/12 Python
python找出一个列表中相同元素的多个索引实例
2019/06/11 Python
基于Python词云分析政府工作报告关键词
2020/06/02 Python
python如何处理程序无法打开
2020/06/16 Python
T3官网:头发造型工具
2019/12/26 全球购物
巴西备受欢迎的服装和生活方式品牌:FARM Rio
2020/02/04 全球购物
安全大检查反思材料
2014/01/31 职场文书
广告词串烧
2014/03/19 职场文书
协议书与合同的区别
2014/04/18 职场文书
物业公司的岗位任命书
2014/06/06 职场文书
新闻报道策划方案
2014/06/11 职场文书
演讲稿之我的初心我的成长
2019/08/12 职场文书
oracle表分区的概念及操作
2021/04/24 Oracle
go mod 安装依赖 unkown revision问题的解决方案
2021/05/06 Golang
Python保存并浏览用户的历史记录
2022/04/29 Python