使用Pyqt5制作屏幕录制界面

  • 应用平台
  • 窗口设置
  • 主体窗口代码
  • 划选窗口代码
  • 总结

最近有在使用屏幕录制软件录制桌面,在用的过程中突发奇想,使用python能不能做屏幕录制工具,也锻炼下自己的动手能力。
接下准备写使用python如何做屏幕录制工具的系列文章:

  • 录制屏幕制作视频
  • 录制音频
  • 合成视频,音频
  • 基于pyqt5制作可视化窗口

大概上述四个部分,希望自己能够尽快完善,前两篇文章分享了利用opencv制作了屏幕录制部分,利用PyAudio录制音频,本篇文章分享如何使用ffmpeg将同时录制的屏幕录像和音频合成为有声音的屏幕录像。

应用平台

  • windows 10

  • python 3.7

  • ffmpeg

窗口设置

暂定窗口显示效果如下,固定大小:

  • 左侧显示部分:显示当前抓取的窗口图像

  • 右侧–选择区域:点击按钮会出现半透明框,左击鼠标划选,松开选定,此时按钮显示划选的窗口大小,并且左侧进行显示当前划选位置的图像。

  • 是否录制鼠标:默认录制,若在录制过程中鼠标出现频闪现象属于正常。

  • 画面录制帧率:10~60,默认为15,步进单位为1。

  • 音频来源:会读取当前设备支持的音频录制硬件并显示,可选择无,即不录制声音。

  • 保存目录:选择当前录制的音频保存位置,在首次录制时必须选择。 命名规则为当前时间戳,每次录制结束后会更新时间戳作为新的文件名。

  • 开始/停止:快捷键F7,开始录制或停止录制桌面视频。

主体窗口代码

在窗口设计中选择合适的部件是非常重要的,可以使用QtDesigner,拉取部件并绘制合适的窗口大小,使用pip install pyqt5-tools安装,在包路径下可以找到QtDesigner工具,布局好后将ui文件导出成py文件,在后续绑定函数时继续使用,或者使用代码编码创建窗口。

from PyQt5.QtWidgets import (QMainWindow, QApplication, QDesktopWidget, QWidget, QFrame,QLabel, QPushButton, QComboBox, QCheckBox, QSpinBox, QDialog, QFileDialog, QMessageBox)
from PyQt5.QtGui import QIcon, QFont, QColor, QImage, QPixmap, QPen, QPainter
from PyQt5.QtCore import QRect, Qt, QPoint, QMetaObject, QThread  class Ui_MainWindow(QMainWindow):"""主体窗口设置"""def __init__(self):super().__init__()self.setObjectName("MainWindow")  # 设置窗口对象名称self.setWindowTitle('屏幕录制')    # 设置窗口标题self.resize(512, 352)   # 设置窗口大小self.setupUi()     # 设置显示部件self.show()        # 窗口显示def setipUi(self):# 设置窗口需要显示的部件# self.centralwidget = QWidget(self)  部件载体# self.centralwidget.setObjectName("centralwidget")# 标签框设置: QLabel(self.centralwidget)# 复选框设置: QCheckBox(self.centralwidget)# 按键设置:   QPushButton(self.centralwidget)# 调度框设置: QSpinBox(self.centralwidget)def main():"""运行函数"""app = QApplication(sys.argv)app.setAttribute(Qt.AA_UseHighDpiPixmaps)ui = Ui_MainWindow()sys.exit(app.exec_())if __name__ == '__main__':main()

划选窗口代码

在录制桌面屏幕有只录制部分界面的需求,这需要设置一个事件来完成划选的动作,这里选择重新打开一个窗口来充满整个屏幕,鼠标在新建立的画面中可以滑动鼠标以选择需要录制的窗口部分。

class MousePaint(QDialog):"""移动鼠标获取屏幕捕获范围"""def __init__(self):super().__init__()self.setMouseTracking(True)# 设置窗口布满整个屏幕self.showFullScreen()# 设置窗体无边框self.setWindowFlags(Qt.FramelessWindowHint)  # 窗口置顶,无边框# 设置背景透明self.setWindowOpacity(0.5)self.initUI()self.setFocus()def initUI(self):self.setGeometry(*(QDesktopWidget().screenGeometry()).getRect())self.pix = QPixmap()self.lastpoint = QPoint()self.endpoint = QPoint()self.pos = Noneself.bline = 0def mousePressEvent(self, event):# 监听鼠标按压事件if event.button() == Qt.LeftButton:self.lastpoint = event.x(), event.y()self.bline = 1elif event.button() == Qt.RightButton:self.close()event.accept()def mouseReleaseEvent(self, event):# 监听鼠标释放事件self.endpoint = event.x(), event.y()self.bline = 0event.accept()self.close()def mouseMoveEvent(self, event):# 监听鼠标移动事件if self.bline == 1:self.pos = event.x(), event.y()event.accept()self.update()def paintEvent(self, event):# 绘画事件if self.bline == 1:pp = QPainter(self)pen = QPen()  # 定义笔格式对象pen.setWidth(5)  # 设置笔的宽度pen.setColor(QColor(255, 0, 0))pp.setPen(pen)lpx, lpy = self.lastpointpp.drawRect(lpx, lpy, self.pos[0] - lpx, self.pos[1] - lpy)event.accept()

监听鼠标事件在Pyqt5中都有相应的事件方法,这里只需要重载函数,并在对应函数方法下定义在本次监听事件中需要完成怎样的任务即可。

跟主窗口函数部分进行照应,当按下选择区域按钮后,打开屏幕捕获窗口,当选择完成时,返回窗口位置及大小,在主窗口显示窗口画面及大小。

在窗口运行过程中录制视频,如果未在程序中设置线程进行任务会造成窗口界面出现卡死现象,所以在调用录制视频和录制音频部分,可以使用线程与界面运行程序进行分离。

例如:

from PyQt5.QtCore import QThread  # Pyqt5的QThread类
from Screenshot_record import Screenshotclass Thread_screenshot(QThread):def __init__(self):super().__init__()self.screen = Screenshot()  # 屏幕录制类

总结

用python动手做一个屏幕录制工具到这里已经完成了,后续如果有改进部分依旧会更新文章,此系列中使用了很多第三方包,也就是因为python第三包繁多且优质,可以减少很多时间,通过这些第三方包来组建自己想要实现程序。由于总体代码限于文章篇幅,已经该系列文章所提到的代码上传至github,如有兴趣,可下载测试。

源码储存仓库:

https://github.com/lk-itween/FunnyCodeRepository/tree/main/Screenshot

软件链接提取:

如需测试生成的软件(仅windows平台)。
github
阿里云盘

春雨润土,春风宜人。


于二零二二年四月二十一日作

使用Pyqt5制作屏幕录制界面相关推荐

  1. 使用opencv-python制作屏幕录制工具

    使用opencv-python制作屏幕录制工具 应用平台 屏幕录制部分 计算视频最优fps及使用numpy计算中间帧数组 使用pynput监听键盘按键 如何保存MP4格式视频 总结 最近有在使用屏幕录 ...

  2. 手把手教你使用opencv-python库制作屏幕录制工具(附源码)

    目录 目录 应用平台 屏幕录制部分 计算视频最优fps及使用numpy计算中间帧数组 使用pynput监听键盘按键 如何保存MP4格式视频 源码 总结 最近有在使用屏幕录制软件录制桌面,在用的过程中突 ...

  3. 界面开发(2)--- 使用PyQt5制作用户登陆界面

    使用PyQt5制作用户登陆界面 上篇文章已经介绍了如何配置PyQt5环境,这篇文章在此基础上展开,主要记录一下如何使用 PyQt5 制作用户登陆界面,并对一些基础操作进行介绍. 下面是具体步骤,一起来 ...

  4. 录屏软件电脑版免费哪个好?4款免费屏幕录制软件下载

    在电脑上经常能使用的录屏功能:录制软件的操作过程.精彩的游戏瞬间.经典的影视故事.网络教学等.许多人都在问,录屏软件电脑版哪个好?Windows平台上有很多录屏软件,如果对录屏需求不高的朋友,可以通过 ...

  5. 苹果屏幕录制5831_苹果怎么录屏幕视频?教你轻松开启内置录屏功能

    苹果怎么录屏幕视频?随着iPhone功能的不断更新换代,iOS系统也早已提供了内置的录屏功能,不过很多小伙伴不清楚怎么使用苹果手机的录屏功能,你还在使用第三方的录屏软件吗?苹果手机升级到iOS 11以 ...

  6. 电脑屏幕录制怎么弄,简单好用的3种电脑录屏方法

    平时工作或者学习都需要使用电脑进行录屏操作,比如录制线上网课.游戏画面.教学课程录屏等等.电脑屏幕录制怎么弄?可以使用专业录屏软件或者是电脑自带的屏幕录制功能来录屏:今天给大家分享3款简单好用的电脑录 ...

  7. SwiftUI 制作苹果屏幕录制大师App(教程含源码)ReplayKit

    实战需求 SwiftUI 制作苹果录制大师App 本文价值与收获 看完本文后,您将能够作出下面的界面 看完本文您将掌握的技能 掌握 ReplayKit 掌握 RPScreenRecorder 掌握 N ...

  8. python制作好看的界面_【一点资讯】Python界面如何漂亮的展示树形结构,PyQt5控件之QTreeWidget详解 www.yidianzixun.com...

    前面内容,我们介绍了关于PyQt5的一些常用高级控件的使用,为了更好的便于大家理解,我们通过一些案例进行了讲解.用户接口 用Python将电子表格Excel展示在界面中,PyQt5之QTableWid ...

  9. python qt5 增加文本框_Python用PyQt5制作弹出式输入框,Qt图形界面编程之QInputDialog...

    前面内容,我们介绍了PyQt5的一些常用基本控件. 温故而知新 计数器QSpinBox使用详解,Python用PyQt5制作图形界面基础控件篇 Python用PyQt5实现多种弹出消息框,QMessa ...

最新文章

  1. 虚拟机下Linux安装图解之一:VMware Workstation的安装
  2. Android开发--XML文件解析
  3. DirectX视口变换矩阵详解
  4. Linux多进程拷贝fork,浅析linux中fork函数
  5. 2020\Simulation_1\5.数位递增的数
  6. vue-cli脚手架中webpack配置基础文件详解
  7. Reddit程序员的酒后真言
  8. 试一下live writer 插入代码是否会高亮
  9. 樱花动漫中的视频下载分析
  10. 【从零开始学架构-李运华】开篇词|照着做,你也能成为架构师!
  11. 联想拯救者Y7000p+Nvidia rtx2060 显卡驱动安装
  12. 大话西游2人数最多服务器,大话西游2:全服最火服务器!凌烟阁人山人海遍地200级玩家...
  13. efi分区隐藏_win10如何隐藏efi分区|win10如何隐藏efi分区的方法
  14. 多项式计算的Horner方法
  15. 爬虫实战:链家租房数据爬取,实习僧网站数据爬取
  16. 初识C++之智能指针
  17. 视觉Transformer综述
  18. 解决小程序-wx.canvasGetImageData()-RGB取色盘苹果手机获取颜色慢问题
  19. 模拟幂律分布(附C语言代码)
  20. JAVA Swt初识

热门文章

  1. ssm附件上传时(mutilpart/form-data)后台接收其他数据为空
  2. 不差钱的滴滴为什么着急上市?
  3. 判断APP用户手机是否开启了定位服务
  4. Matlab论文插图绘制模板第55期—带等高线的网格曲面图(Meshc)
  5. JS 对手机号和身份证号进行脱敏处理
  6. 98条一句话经典爱情短信
  7. Lesson 9.2 随机森林回归器的参数
  8. 一个完整的EJB Web应用(JPA示例)
  9. C++数据结构 —— 红黑树
  10. 虎牙与斗鱼合会对直播行业格局带来怎样的影响?