持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情
有很多时候需要给客户进行远程演示,但是又不能重复演示很多次,而且用户有时间时自己又可能没有时间进行远程操作,于是自己动手制作一款录屏软件,虽然没有市面上的那么好,但好歹是自己动手的结果,而且结合前面的图像处理教程,可以制作许多特效,现在首先完成基础版。
首先开始录制和结束录制两个按钮是必须的,在录制过程中为了体现录制的过程是否正常需要一个label中循环的显示录制进程,说白了就是“录制中”三个字加几个.,这个点由1-3个循环的显示。
界面规划好了,下面直接开始制作界面,代码如下
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(703, 588)
self.verticalLayoutWidget = QtWidgets.QWidget(Form)
self.verticalLayoutWidget.setGeometry(QtCore.QRect(260, 210, 160, 80))
self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setObjectName("verticalLayout")
self.pushButton = QtWidgets.QPushButton(self.verticalLayoutWidget)
self.pushButton.setObjectName("pushButton")
self.verticalLayout.addWidget(self.pushButton)
self.pushButton_2 = QtWidgets.QPushButton(self.verticalLayoutWidget)
self.pushButton_2.setObjectName("pushButton_2")
self.verticalLayout.addWidget(self.pushButton_2)
self.label = QtWidgets.QLabel(self.verticalLayoutWidget)
self.label.setLayoutDirection(QtCore.Qt.LeftToRight)
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
self.verticalLayout.addWidget(self.label)
self.label_2 = QtWidgets.QLabel(Form)
self.label_2.setGeometry(QtCore.QRect(200, 300, 291, 181))
self.label_2.setText("")
self.label_2.setObjectName("label_2")
self.retranslateUi(Form)
self.pushButton.clicked.connect(Form.startCapture) # type: ignore
self.pushButton_2.clicked.connect(Form.stopCapture) # type: ignore
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.pushButton.setText(_translate("Form", "录制屏幕"))
self.pushButton_2.setText(_translate("Form", "结束录制"))
self.label.setText(_translate("Form", "录制时请隐藏本窗口"))
界面运行时大概长下面的样子,他的样子取决于你对他的定制
上面提示录制时请隐藏本窗口,当然也可以设置自动隐藏,我已经设置好了,下面放主程序代码
from screenCapture import Ui_Form
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys
import time,threading
from datetime import datetime
from PIL import ImageGrab
import cv2
import numpy as np
from pynput import keyboard
class MainWindow(QMainWindow, Ui_Form):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent=parent)
self.setupUi(self)
self.MyTimer = QTimer()
self.MyTimer1 = QTimer()
self.name = None
def startCapture(self):
self.countSave = 0
self.fps = 15
self.flag = False
self.count = 1
self.name = datetime.now().strftime('%Y-%m-%d %H-%M-%S')
self.screen = ImageGrab.grab()
self.width, self.high = self.screen.size
self.fourcc = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D')
self.video = cv2.VideoWriter('%s.avi' % self.name, self.fourcc, self.fps, (self.width, self.high))
print('开始录制!')
self.label_2.setText("录制中!")
self.start_time = time.time()
self.showMinimized()
self.MyTimer.start(50)
self.MyTimer.timeout.connect(self.video_record)
def video_record(self): # 录入视频
if self.flag:
print("录制结束!")
self.final_time = time.time()
self.video.release()
if self.count == 1:
self.label_2.setText("录制中.")
elif self.count == 2:
self.label_2.setText("录制中..")
else:
self.label_2.setText("录制中...")
self.count += 1
self.count = self.count % 4
self.im = ImageGrab.grab()
frame = cv2.cvtColor(np.array(self.im), cv2.COLOR_RGB2BGR)
self.video.write(frame)
def stopCapture(self):
if self.MyTimer.isActive():
self.MyTimer.stop()
self.label_2.setText("录制结束\n录制文件名:{}".format(self.name))
if self.name is None:
self.label_2.setText("视频还未录制!")
else:
self.flag = True
if __name__ == "__main__":
app = QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
录制结束时提示录制结束,并将录制的文件名输出到label中显示
录取文件信息如下