本篇文章小编给大家分享一下使用Pyqt5制作屏幕录制界面功能代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
应用平台
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 = None self.bline = 0 def mousePressEvent(self, event): # 监听鼠标按压事件 if event.button() == Qt.LeftButton: self.lastpoint = event.x(), event.y() self.bline = 1 elif event.button() == Qt.RightButton: self.close() event.accept() def mouseReleaseEvent(self, event): # 监听鼠标释放事件 self.endpoint = event.x(), event.y() self.close() def mouseMoveEvent(self, event): # 监听鼠标移动事件 if self.bline == 1: self.pos = event.x(), event.y() event.accept() self.update() def paintEvent(self, event): # 绘画事件 pp = QPainter(self) pen = QPen() # 定义笔格式对象 pen.setWidth(5) # 设置笔的宽度 pen.setColor(QColor(255, 0, 0)) pp.setPen(pen) lpx, lpy = self.lastpoint pp.drawRect(lpx, lpy, self.pos[0] - lpx, self.pos[1] - lpy)
监听鼠标事件在Pyqt5中都有相应的事件方法,这里只需要重载函数,并在对应函数方法下定义在本次监听事件中需要完成怎样的任务即可。
跟主窗口函数部分进行照应,当按下选择区域按钮后,打开屏幕捕获窗口,当选择完成时,返回窗口位置及大小,在主窗口显示窗口画面及大小。
在窗口运行过程中录制视频,如果未在程序中设置线程进行任务会造成窗口界面出现卡死现象,所以在调用录制视频和录制音频部分,可以使用线程与界面运行程序进行分离。
例如:
from PyQt5.QtCore import QThread # Pyqt5的QThread类 from Screenshot_record import Screenshot class Thread_screenshot(QThread): def __init__(self): super().__init__() self.screen = Screenshot() # 屏幕录制类