diff --git a/src/qt/Mainwindow.py b/src/qt/Mainwindow.py index 5e99b9d..88f8347 100644 --- a/src/qt/Mainwindow.py +++ b/src/qt/Mainwindow.py @@ -6,15 +6,17 @@ # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit this file unless you know what you are doing. - - +import os import sys + +import cv2 +from PyQt5.QtCore import Qt +from PyQt5.QtGui import QPixmap +from PyQt5.QtWidgets import QApplication from PyQt5.QtWidgets import * from findpath_UI import * -from Screenshot.Screenshot_Gui import * +from app import ScreenBar import qdarkstyle - -sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/../../PaddleClas-release-2.3") import Tello.KeyboardControl as KeyControl class Ui_MainWindow(object): @@ -32,142 +34,214 @@ class Ui_MainWindow(object): self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frame.setFrameShadow(QtWidgets.QFrame.Raised) self.frame.setObjectName("frame") - self.label = QtWidgets.QLabel(self.frame) - self.label.setGeometry(QtCore.QRect(0, 0, 111, 21)) + #设置无人机状态 + self.tellostate = QtWidgets.QLabel(self.frame) + self.tellostate.setGeometry(QtCore.QRect(0, 0, 111, 25)) font = QtGui.QFont() font.setFamily("微软雅黑") font.setPointSize(14) font.setBold(True) font.setWeight(75) - self.label.setFont(font) - self.label.setStyleSheet("QLabel\n" -"{\n" -" color:white\n" -"}") - self.label.setObjectName("label") - self.label_2 = QtWidgets.QLabel(self.frame) - self.label_2.setGeometry(QtCore.QRect(20, 30, 341, 41)) + self.tellostate.setFont(font) + self.tellostate.setStyleSheet("QLabel\n" + "{\n" + " color:white\n" + "}") + self.tellostate.setObjectName("tellostate") + #设置充电状态 + self.charge = QtWidgets.QLabel(self.frame) + self.charge.setGeometry(QtCore.QRect(20, 30, 341, 41)) + font = QtGui.QFont() + font.setFamily("微软雅黑") + font.setPointSize(10) + font.setBold(True) + font.setWeight(75) + self.charge.setFont(font) + self.charge.setObjectName("charge") + self.chargetxt = QtWidgets.QLabel(self.frame) + self.chargetxt.setGeometry(QtCore.QRect(100, 30, 341, 41)) + font = QtGui.QFont() + font.setFamily("微软雅黑") + font.setPointSize(10) + font.setBold(True) + font.setWeight(75) + self.chargetxt.setFont(font) + self.chargetxt.setObjectName("chargetxt") + #设置WIFI状态 + self.Wifi = QtWidgets.QLabel(self.frame) + self.Wifi.setGeometry(QtCore.QRect(20, 100, 341, 41)) font = QtGui.QFont() font.setFamily("微软雅黑") font.setPointSize(10) font.setBold(True) font.setWeight(75) - self.label_2.setFont(font) - self.label_2.setObjectName("label_2") - self.label_3 = QtWidgets.QLabel(self.frame) - self.label_3.setGeometry(QtCore.QRect(20, 100, 341, 41)) + self.Wifi.setFont(font) + self.Wifi.setObjectName("Wifi") + self.Wifitxt = QtWidgets.QLabel(self.frame) + self.Wifitxt.setGeometry(QtCore.QRect(100, 100, 341, 41)) font = QtGui.QFont() font.setFamily("微软雅黑") font.setPointSize(10) font.setBold(True) font.setWeight(75) - self.label_3.setFont(font) - self.label_3.setObjectName("label_3") + self.Wifitxt.setFont(font) + self.Wifitxt.setObjectName("Wifitxt") self.frame_2 = QtWidgets.QFrame(self.centralwidget) self.frame_2.setGeometry(QtCore.QRect(840, 250, 391, 421)) self.frame_2.setStyleSheet("QPushButton\n" -"{\n" -" color:white\n" -"}") + "{\n" + " color:white\n" + "}") self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_2.setObjectName("frame_2") - self.label_4 = QtWidgets.QLabel(self.frame_2) - self.label_4.setGeometry(QtCore.QRect(0, 0, 101, 31)) + #设置无人机控制部分 + self.tellocontrol = QtWidgets.QLabel(self.frame_2) + self.tellocontrol.setGeometry(QtCore.QRect(0, 0, 101, 31)) font = QtGui.QFont() font.setFamily("微软雅黑") font.setPointSize(14) font.setBold(True) font.setWeight(75) - self.label_4.setFont(font) - self.label_4.setStyleSheet("QLabel\n" -"{\n" -" color:white\n" -"}\n" -"") - self.label_4.setObjectName("label_4") - self.pushButton_3 = QtWidgets.QPushButton(self.frame_2) - self.pushButton_3.setGeometry(QtCore.QRect(70, 30, 231, 91)) + self.tellocontrol.setFont(font) + self.tellocontrol.setStyleSheet("QLabel\n" + "{\n" + " color:white\n" + "}\n" + "") + self.tellocontrol.setObjectName("tellocontrol") + self.btn_tello_up = QtWidgets.QPushButton(self.frame_2) + self.btn_tello_up.setGeometry(QtCore.QRect(60, 30, 231, 91)) font = QtGui.QFont() font.setFamily("Arial") font.setPointSize(10) font.setBold(True) font.setWeight(75) - self.pushButton_3.setFont(font) + self.btn_tello_up.setFont(font) icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap("tello_png/qifei.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.pushButton_3.setIcon(icon1) - self.pushButton_3.setIconSize(QtCore.QSize(150, 150)) - self.pushButton_3.setObjectName("pushButton_3") - self.pushButton_6 = QtWidgets.QPushButton(self.frame_2) - self.pushButton_6.setGeometry(QtCore.QRect(60, 310, 231, 91)) + self.btn_tello_up.setIcon(icon1) + self.btn_tello_up.setIconSize(QtCore.QSize(150, 150)) + self.btn_tello_up.setObjectName("btn_tello_up") + self.upload = QtWidgets.QPushButton(self.frame_2) + self.upload.setGeometry(QtCore.QRect(300, 30, 50, 180)) + font = QtGui.QFont() + font.setFamily("Arial") + font.setPointSize(10) + font.setBold(True) + font.setWeight(75) + self.upload.setFont(font) + self.upload.setObjectName("upload") + self.download = QtWidgets.QPushButton(self.frame_2) + self.download.setGeometry(QtCore.QRect(300, 220, 50, 180)) + font = QtGui.QFont() + font.setFamily("Arial") + font.setPointSize(10) + font.setBold(True) + font.setWeight(75) + self.download.setFont(font) + self.download.setObjectName("download") + self.btn_tello_down = QtWidgets.QPushButton(self.frame_2) + self.btn_tello_down.setGeometry(QtCore.QRect(60, 310, 231, 91)) font = QtGui.QFont() font.setFamily("Arial") font.setPointSize(10) font.setBold(True) font.setItalic(False) font.setWeight(75) - self.pushButton_6.setFont(font) + self.btn_tello_down.setFont(font) icon2 = QtGui.QIcon() icon2.addPixmap(QtGui.QPixmap("tello_png/jiangluo.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.pushButton_6.setIcon(icon2) - self.pushButton_6.setIconSize(QtCore.QSize(150, 150)) - self.pushButton_6.setObjectName("pushButton_6") - self.pushButton_4 = QtWidgets.QPushButton(self.frame_2) - self.pushButton_4.setGeometry(QtCore.QRect(220, 220, 71, 71)) - self.pushButton_4.setText("") + self.btn_tello_down.setIcon(icon2) + self.btn_tello_down.setIconSize(QtCore.QSize(150, 150)) + self.btn_tello_down.setObjectName("btn_tello_down") + self.btn_tello_right = QtWidgets.QPushButton(self.frame_2) + self.btn_tello_right.setGeometry(QtCore.QRect(220, 220, 71, 71)) + self.btn_tello_right.setText("") icon3 = QtGui.QIcon() icon3.addPixmap(QtGui.QPixmap("tello_png/right.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.pushButton_4.setIcon(icon3) - self.pushButton_4.setIconSize(QtCore.QSize(70, 100)) - self.pushButton_4.setObjectName("pushButton_4") - self.pushButton_2 = QtWidgets.QPushButton(self.frame_2) - self.pushButton_2.setGeometry(QtCore.QRect(60, 220, 71, 71)) - self.pushButton_2.setText("") + self.btn_tello_right.setIcon(icon3) + self.btn_tello_right.setIconSize(QtCore.QSize(70, 100)) + self.btn_tello_right.setObjectName("btn_tello_right") + self.btn_tello_left = QtWidgets.QPushButton(self.frame_2) + self.btn_tello_left.setGeometry(QtCore.QRect(60, 220, 71, 71)) + self.btn_tello_left.setText("") icon4 = QtGui.QIcon() icon4.addPixmap(QtGui.QPixmap("tello_png/left.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.pushButton_2.setIcon(icon4) - self.pushButton_2.setIconSize(QtCore.QSize(70, 100)) - self.pushButton_2.setObjectName("pushButton_2") - self.pushButton_5 = QtWidgets.QPushButton(self.frame_2) - self.pushButton_5.setGeometry(QtCore.QRect(140, 220, 71, 71)) - self.pushButton_5.setText("") + self.btn_tello_left.setIcon(icon4) + self.btn_tello_left.setIconSize(QtCore.QSize(70, 100)) + self.btn_tello_left.setObjectName("btn_tello_left") + self.btn_tello_hold = QtWidgets.QPushButton(self.frame_2) + self.btn_tello_hold.setGeometry(QtCore.QRect(140, 220, 71, 71)) + self.btn_tello_hold.setText("") icon5 = QtGui.QIcon() - icon5.addPixmap(QtGui.QPixmap("tello_png/return.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.pushButton_5.setIcon(icon5) - self.pushButton_5.setIconSize(QtCore.QSize(70, 100)) - self.pushButton_5.setObjectName("pushButton_5") - self.pushButton = QtWidgets.QPushButton(self.frame_2) - self.pushButton.setGeometry(QtCore.QRect(140, 140, 71, 71)) - self.pushButton.setText("") + icon5.addPixmap(QtGui.QPixmap("tello_png/hold.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.btn_tello_hold.setIcon(icon5) + self.btn_tello_hold.setIconSize(QtCore.QSize(70, 100)) + self.btn_tello_hold.setObjectName("btn_tello_hold") + self.btn_tello_forward = QtWidgets.QPushButton(self.frame_2) + self.btn_tello_forward.setGeometry(QtCore.QRect(140, 140, 71, 71)) + self.btn_tello_forward.setText("") icon6 = QtGui.QIcon() icon6.addPixmap(QtGui.QPixmap("tello_png/up.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.pushButton.setIcon(icon6) - self.pushButton.setIconSize(QtCore.QSize(70, 100)) - self.pushButton.setObjectName("pushButton") + self.btn_tello_forward.setIcon(icon6) + self.btn_tello_forward.setIconSize(QtCore.QSize(70, 100)) + self.btn_tello_forward.setObjectName("btn_tello_forward") + self.btn_tello_turnright = QtWidgets.QPushButton(self.frame_2) + self.btn_tello_turnright.setGeometry(QtCore.QRect(220, 140, 71, 71)) + self.btn_tello_turnright.setText("") + icon6 = QtGui.QIcon() + icon6.addPixmap(QtGui.QPixmap("tello_png/return.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.btn_tello_turnright.setIcon(icon6) + self.btn_tello_turnright.setIconSize(QtCore.QSize(70, 100)) + self.btn_tello_turnright.setObjectName("btn_tello_turnright") + self.btn_tello_turnleft = QtWidgets.QPushButton(self.frame_2) + self.btn_tello_turnleft.setGeometry(QtCore.QRect(60, 140, 71, 71)) + self.btn_tello_turnleft.setText("") + icon6 = QtGui.QIcon() + icon6.addPixmap(QtGui.QPixmap("tello_png/return_2.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.btn_tello_turnleft.setIcon(icon6) + self.btn_tello_turnleft.setIconSize(QtCore.QSize(70, 100)) + self.btn_tello_turnleft.setObjectName("btn_tello_turnleft") + #设置无人机连接部分 self.frame_3 = QtWidgets.QFrame(self.centralwidget) self.frame_3.setGeometry(QtCore.QRect(840, 680, 391, 80)) self.frame_3.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frame_3.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_3.setObjectName("frame_3") - self.pushButton_7 = QtWidgets.QPushButton(self.frame_3) - self.pushButton_7.setGeometry(QtCore.QRect(20, 10, 75, 61)) - self.pushButton_7.setText("") + self.btn_tello_connect = QtWidgets.QPushButton(self.frame_3) + self.btn_tello_connect.setGeometry(QtCore.QRect(20, 10, 75, 61)) + self.btn_tello_connect.setText("") icon7 = QtGui.QIcon() icon7.addPixmap(QtGui.QPixmap("window_png/连接.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.pushButton_7.setIcon(icon7) - self.pushButton_7.setIconSize(QtCore.QSize(60, 60)) - self.pushButton_7.setObjectName("pushButton_7") - self.label_5 = QtWidgets.QLabel(self.frame_3) - self.label_5.setGeometry(QtCore.QRect(120, 15, 231, 51)) + self.btn_tello_connect.setIcon(icon7) + self.btn_tello_connect.setIconSize(QtCore.QSize(60, 60)) + self.btn_tello_connect.setObjectName("btn_tello_connect") + self.connectstate = QtWidgets.QLabel(self.frame_3) + self.connectstate.setGeometry(QtCore.QRect(120, 15, 231, 51)) + font = QtGui.QFont() + font.setFamily("微软雅黑") + font.setPointSize(10) + font.setBold(True) + font.setWeight(75) + self.connectstate.setFont(font) + self.connectstate.setObjectName("connectstate") + self.connecttxt = QtWidgets.QLabel(self.frame_3) + self.connecttxt.setGeometry(QtCore.QRect(200, 15, 231, 51)) font = QtGui.QFont() font.setFamily("微软雅黑") font.setPointSize(10) font.setBold(True) font.setWeight(75) - self.label_5.setFont(font) - self.label_5.setObjectName("label_5") + self.connecttxt.setFont(font) + self.connecttxt.setStyleSheet("QLabel\n" + "{\n" + " color:red\n" + "}\n" + "") + self.connecttxt.setObjectName("connecttxt") MainWindow.setCentralWidget(self.centralwidget) + #上方工具栏 self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 1260, 23)) self.menubar.setObjectName("menubar") @@ -184,86 +258,132 @@ class Ui_MainWindow(object): self.toolBar.setIconSize(QtCore.QSize(50, 24)) self.toolBar.setObjectName("toolBar") MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar) - self.actionicon = QtWidgets.QAction(MainWindow) + self.tello = QtWidgets.QAction(MainWindow) icon8 = QtGui.QIcon() icon8.addPixmap(QtGui.QPixmap("window_png/实时画面-1.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.actionicon.setIcon(icon8) - self.actionicon.setObjectName("actionicon") - self.actionicon_2 = QtWidgets.QAction(MainWindow) + self.tello.setIcon(icon8) + self.tello.setObjectName("tello") + self.pathfind = QtWidgets.QAction(MainWindow) icon9 = QtGui.QIcon() icon9.addPixmap(QtGui.QPixmap("window_png/路径分析-1.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.actionicon_2.setIcon(icon9) - self.actionicon_2.setObjectName("actionicon_2") - self.actionicon_3 = QtWidgets.QAction(MainWindow) + self.pathfind.setIcon(icon9) + self.pathfind.setObjectName("pathfind") + self.screenshot = QtWidgets.QAction(MainWindow) icon10 = QtGui.QIcon() icon10.addPixmap(QtGui.QPixmap("window_png/录像.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.actionicon_3.setIcon(icon10) - self.actionicon_3.setObjectName("actionicon_3") + self.screenshot.setIcon(icon10) + self.screenshot.setObjectName("screenshot") self.menubar.addAction(self.menu.menuAction()) self.menubar.addAction(self.menu_2.menuAction()) - self.toolBar.addAction(self.actionicon) - self.toolBar.addAction(self.actionicon_2) - self.toolBar.addAction(self.actionicon_3) - self.actionicon_2.triggered.connect(lambda: self.path()) - self.actionicon_3.triggered.connect(lambda: self.video()) - self.pushButton_7.clicked.connect(lambda: self.connect()) - self.pushButton_3.clicked.connect(lambda: self.up()) - self.pushButton_6.clicked.connect(lambda: self.down()) - self.pushButton.clicked.connect(lambda: self.forward()) - self.pushButton_4.clicked.connect(lambda: self.right()) - self.pushButton_2.clicked.connect(lambda: self.left()) - self.pushButton_5.clicked.connect(lambda: self.Return()) + self.toolBar.addAction(self.tello) + self.toolBar.addAction(self.pathfind) + self.toolBar.addAction(self.screenshot) + self.img_label = QtWidgets.QLabel() + self.connect_flag = False + #槽函数部分 + self.pathfind.triggered.connect(lambda: self.path()) + self.screenshot.triggered.connect(lambda: self.video()) + self.btn_tello_connect.clicked.connect(lambda: self.connect()) + self.btn_tello_up.clicked.connect(lambda: self.up()) + self.btn_tello_down.clicked.connect(lambda: self.down()) + self.btn_tello_forward.clicked.connect(lambda: self.forward()) + self.btn_tello_right.clicked.connect(lambda: self.right()) + self.btn_tello_left.clicked.connect(lambda: self.left()) + self.btn_tello_hold.clicked.connect(lambda: self.Return()) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) - + #点击路径分析事件 def path(self): self.MainWindow1 = QMainWindow() ui = Ui_MainWindow1() ui.setupUi(self.MainWindow1) self.MainWindow1.show() - + #点击屏幕录制事件 def video(self): - self.ui = Ui_MainWindow2() - self.ui.show() - + bar.show() + #点击连接无人机事件 def connect(self): - KeyControl.connect() + self.connect_flag = True + self.connecttxt.setStyleSheet("QLabel\n" + "{\n" + " color:green\n" + "}\n" + "") + self.connecttxt.setText("已连接") + self.chargetxt.setStyleSheet("QLabel\n" + "{\n" + " color:green\n" + "}\n" + "") + self.chargetxt.setText("100%") + self.Wifitxt.setStyleSheet("QLabel\n" + "{\n" + " color:green\n" + "}\n" + "") + self.Wifitxt.setText("强") + KeyControl.connect() + #点击无人机起飞事件 def up(self): - KeyControl.getKeyboardInput("UP") - + if self.connect_flag: + KeyControl.getKeyboardInput("UP") + else: + return + #点击无人机降落事件 def down(self): - KeyControl.getKeyboardInput("DOWN") - + if self.connect_flag: + KeyControl.getKeyboardInput("DOWN") + else: + return + #点击无人机前进事件 def forward(self): - KeyControl.getKeyboardInput("i") - + if self.connect_flag: + KeyControl.getKeyboardInput("i") + else: + return + #点击无人机右偏事件 def right(self): - KeyControl.getKeyboardInput("l") - + if self.connect_flag: + KeyControl.getKeyboardInput("l") + else: + return + #点击无人机左偏事件 def left(self): - KeyControl.getKeyboardInput("j") - + if self.connect_flag: + KeyControl.getKeyboardInput("j") + else: + return + #点击无人机停止事件 def Return(self): - KeyControl.getKeyboardInput("a") - KeyControl.getKeyboardInput("dffsfdsa") + if self.connect_flag: + KeyControl.getKeyboardInput("a") + KeyControl.getKeyboardInput("dffsfdsa") + else: + return def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "无人机路径生成系统")) - self.label.setText(_translate("MainWindow", "无人机状态")) - self.label_2.setText(_translate("MainWindow", "剩余电量:")) - self.label_3.setText(_translate("MainWindow", "WIFI强度:")) - self.label_4.setText(_translate("MainWindow", "控制面板")) - self.pushButton_3.setText(_translate("MainWindow", "起飞")) - self.pushButton_6.setText(_translate("MainWindow", "降落")) - self.label_5.setText(_translate("MainWindow", "连接状态:")) + self.tellostate.setText(_translate("MainWindow", "无人机状态")) + self.charge.setText(_translate("MainWindow", "剩余电量:")) + self.chargetxt.setText(_translate("MainWindow", "--")) + self.Wifi.setText(_translate("MainWindow", "WIFI强度:")) + self.Wifitxt.setText(_translate("MainWindow", "--")) + self.tellocontrol.setText(_translate("MainWindow", "控制面板")) + self.btn_tello_up.setText(_translate("MainWindow", "起飞")) + self.btn_tello_down.setText(_translate("MainWindow", "降落")) + self.upload.setText(_translate("MainWindow", "上升")) + self.download.setText(_translate("MainWindow", "下降")) + self.connectstate.setText(_translate("MainWindow", "连接状态:")) + self.connecttxt.setText(_translate("MainWindow", "未连接")) self.menu.setTitle(_translate("MainWindow", "实时画面")) self.menu_2.setTitle(_translate("MainWindow", "路径分析")) self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar")) - self.actionicon.setText(_translate("MainWindow", "实时画面")) - self.actionicon_2.setText(_translate("MainWindow", "路径分析")) + self.tello.setText(_translate("MainWindow", "实时画面")) + self.pathfind.setText(_translate("MainWindow", "路径分析")) + if __name__ == '__main__': app = QApplication(sys.argv) @@ -272,4 +392,6 @@ if __name__ == '__main__': ui.setupUi(MainWindow) app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5()) MainWindow.show() - sys.exit(app.exec_()) \ No newline at end of file + bar = ScreenBar() + bar.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint) + sys.exit(app.exec_()) diff --git a/src/qt/Screenshot/Audio_record.py b/src/qt/Screenshot/Audio_record.py deleted file mode 100644 index 89f3561..0000000 --- a/src/qt/Screenshot/Audio_record.py +++ /dev/null @@ -1,133 +0,0 @@ -import time -import wave -from pathlib import Path -from threading import Thread - -from pyaudio import PyAudio, paInt16, paContinue, paComplete - - -class AudioRecord(PyAudio): - - def __init__(self, channels=2): - super().__init__() - self.chunk = 1024 # 每个缓冲区的帧数 - self.format_sample = paInt16 # 采样位数 - self.channels = channels # 声道: 1,单声道;2,双声道 - self.fps = 44100 # 采样频率 - self.input_dict = None - self.output_dict = None - self.stream = None - self.filename = '~test.wav' - self.wf = None - self.stop_flag = False - self.kill = False - - def callback_input(self, in_data, frame_count, time_info, status): - """录制回调函数""" - self.wf.writeframes(in_data) - if not self.stop_flag: - return (in_data, paContinue) - else: - return (in_data, paComplete) - - def callback_output(self, in_data, frame_count, time_info, status): - """播放回调函数""" - data = self.wf.readframes(frame_count) - return (data, paContinue) - - def open_stream(self, name): - """打开录制流""" - input_device_index = self.get_device_index(name, True) if name else None - return self.open(format=self.format_sample, - channels=self.channels, - rate=self.fps, - frames_per_buffer=self.chunk, - input=True, - input_device_index=input_device_index, - stream_callback=self.callback_input - ) - - def audio_record_run(self, name=None): - """音频录制""" - self.wf = self.save_audio_file(self.filename) - self.stream = self.open_stream(name) - self.stream.start_stream() - while self.stream.is_active(): - time.sleep(0.1) - self.wf.close() - if self.kill: - Path(self.filename).unlink() - self.duration = self.get_duration() - self.terminate_run() - - def run(self, filename=None, name=None, record=True): - """音频录制启动""" - if record: - if filename: - self.filename = filename - thread_1 = Thread(target=self.audio_record_run, args=(name,)) - else: - if not filename: - raise Exception('未输入音频文件名,不能播放,请输入后再试!') - thread_1 = Thread(target=self.read_audio, args=(filename, name,)) - thread_1.start() - - def read_audio(self, filename, name=None): - """音频播放""" - output_device_index = self.get_device_index(name, False) if name else None - with wave.open(filename, 'rb') as self.wf: - # 获取音频长度 - self.duration = self.get_duration() - self.stream = self.open(format=self.get_format_from_width(self.wf.getsampwidth()), - channels=self.wf.getnchannels(), - rate=self.wf.getframerate(), - output=True, - output_device_index=output_device_index, - stream_callback=self.callback_output - ) - self.stream.start_stream() - while self.stream.is_active(): - time.sleep(0.1) - print(self.duration) - self.terminate_run() - - def get_duration(self): - """获取音频时长""" - return round(self.wf.getnframes() / self.wf.getframerate(), 2) - - def get_in_out_devices(self): - """获取系统输入输出设备""" - self.input_dict = {} - self.output_dict = {} - for i in range(self.get_device_count()): - devinfo = self.get_device_info_by_index(i) - if not devinfo['hostApi'] and int(devinfo['defaultSampleRate']) == self.fps \ - and '映射器' not in devinfo['name']: - if devinfo['maxInputChannels']: - self.input_dict[devinfo['name'].split(' ')[0]] = i - elif devinfo['maxOutputChannels']: - self.output_dict[devinfo['name'].split(' ')[0]] = i - - def get_device_index(self, name, inp=True): - """获取选定设备索引""" - if inp and self.input_dict: - return self.input_dict.get(name, -1) - elif not inp and self.output_dict: - return self.output_dict.get(name, -1) - - def save_audio_file(self, filename): - """音频文件保存""" - wf = wave.open(filename, 'wb') - wf.setnchannels(self.channels) - wf.setsampwidth(self.get_sample_size(self.format_sample)) - wf.setframerate(self.fps) - return wf - - def terminate_run(self): - """结束流录制或流播放""" - if self.stream is not None: - self.stream.stop_stream() - self.stream.close() - self.stream = None - self.wf = None - self.terminate() diff --git a/src/qt/Screenshot/PyAudio-0.2.11-cp37-cp37m-win_amd64.whl b/src/qt/Screenshot/PyAudio-0.2.11-cp37-cp37m-win_amd64.whl deleted file mode 100644 index 72fbfc8..0000000 Binary files a/src/qt/Screenshot/PyAudio-0.2.11-cp37-cp37m-win_amd64.whl and /dev/null differ diff --git a/src/qt/Screenshot/README.md b/src/qt/Screenshot/README.md deleted file mode 100644 index 4aa3f83..0000000 --- a/src/qt/Screenshot/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# 使用python动手做一个屏幕录制工具 - -*更新日期:2022-04-20* -> windows 10 -> python 3.7 - -- Screeshot_Gui.exe [58.5M] [下载地址](https://github.com/lk-itween/FunnyCodeRepository/releases/download/Screenshot_Gui/Screenshot_Gui.exe) -先将ffmpeg.exe压缩成7z格式,再一并打包进入exe文件中,且使用pyinstaller打包,生成文件较大 - -- Screenshot_Gui.py -pyqt5制作的屏幕录制窗口,窗口程序入口 - -- Screenshot_record.py -使用ffmpeg工具,利用python调用ffmpeg命令行来录制屏幕 - -- Audio_record.py -pyaudio读取可录制音频设备,设定需要使用的设备进行录制音频 - -- Screenshot_record_with_cv2.py -使用opencv-python录制视频并保存 - -- Screenshot_test.py -无窗口化测试联动屏幕录制及音频录制,保持音视频同时录制和同时停止录制 - -- resource -保存程序运行过程中需要使用到的程序或图片 - -- requirements.txt -已将所需模块放在requirements.txt中,可直接pip install -r requirements.txt下载安装。 - -- PyAudio-0.2.11-cp37-cp37m-win_amd64.whl -python3.7环境的PyAudio的轮子 - - -**ps:** -*1. ffmpeg.exe 请至此https://www.gyan.dev/ffmpeg/builds/#release-builds 下载符合的版本,并解压将bin下的ffmpeg.exe移动到resource文件夹下* -*2. 如果PyAudio包不能使用pip在线安装,python3.7环境请下载PyAudio-0.2.11-cp37-cp37m-win_amd64.whl至本地,在该路径下打开cmd窗口,执行pip install 该whl文件* -*3. 其他python环境可在https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio 下自行安装对应版本的whl文件* - diff --git a/src/qt/Screenshot/Screenshot_Gui.py b/src/qt/Screenshot/Screenshot_Gui.py deleted file mode 100644 index 326f626..0000000 --- a/src/qt/Screenshot/Screenshot_Gui.py +++ /dev/null @@ -1,359 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'Screenshot_GUI.ui' -# -# Created by: PyQt5 UI code generator 5.15.4 -# -# WARNING: Any manual changes made to this file will be lost when pyuic5 is -# run again. Do not edit this file unless you know what you are doing. -import sys -import os - -sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/../../PaddleClas-release-2.3") -import shutil - -from datetime import datetime -from pathlib import Path - -from PIL import ImageGrab -from PyQt5.QtCore import QRect, Qt, QPoint, QMetaObject, QThread -from PyQt5.QtGui import QIcon, QFont, QColor, QImage, QPixmap, QPen, QPainter -from PyQt5.QtWidgets import (QMainWindow, QApplication, QDesktopWidget, QWidget, QFrame, - QLabel, QPushButton, QComboBox, QCheckBox, QSpinBox, QDialog, QFileDialog, QMessageBox) - -from Screenshot.Audio_record import AudioRecord -from Screenshot.Screenshot_record import Screenshot, file_path - - -def unpack_7zip_to_exe(filename): - file_basename = Path(file_path(f'{filename}.exe')) - if file_basename.exists(): - return True - elif file_basename.with_suffix('.7z').exists(): - shutil.unpack_archive(file_basename.with_suffix('.7z'), file_basename.parent) - return unpack_7zip_to_exe(file_basename.stem) - else: - return False - -class Thread_screenshot(QThread): - - def __init__(self): - super().__init__() - self.offset_x = 0 - self.offset_y = 0 - self.draw_mouse = 1 - self.filename = '' - self.screen = Screenshot() - - def config_modify(self, **kwargs): - self.screen.width = kwargs.get('width', self.screen.width) - self.screen.height = kwargs.get('height', self.screen.height) - self.screen.fps = kwargs.get('fps', self.screen.fps) - self.offset_x = kwargs.get('offset_x', self.offset_x) - self.offset_y = kwargs.get('offset_y', self.offset_y) - self.draw_mouse = kwargs.get('draw_mouse', self.draw_mouse) - self.filename = kwargs.get('filename', self.filename) - - def compose(self): - video = self.filename + '.mp4' - audio = self.filename + '.mp3' - self.screen.compose_audio(video, audio, video.replace('缓存', '')) - QThread.sleep(1) - self.stop() - Path(audio).unlink() - Path(video).unlink() - - def run(self): - if not self.filename: - raise Exception('请输入filename!') - filename = self.filename + '.mp4' - self.screen.record(filename, self.offset_x, self.offset_y, self.draw_mouse) - - def stop(self): - self.screen.terminate() - - -class Ui_MainWindow2(QMainWindow): - """主体窗口设置""" - - def __init__(self): - super().__init__() - self.setObjectName("MainWindow") - self.setWindowTitle('屏幕录制') - windowico = file_path('gui_svg.svg') - self.setWindowIcon(QIcon(windowico)) - self.resize(512, 352) - self.setFixedSize(512, 352) - self._dir = '.' - self.fname = '' - self.offset_x, self.offset_y = 0, 0 - self.screen_x, self.screen_y = ImageGrab.grab().size - self.audio = AudioRecord() - self.audio.get_in_out_devices() - self.device_name = None - self.record_audio = True if self.audio.input_dict else False - self.hotkey_start = False - self.screenshot = Thread_screenshot() - self.setupUi() - ffmpeg_exists = unpack_7zip_to_exe('ffmpeg') - if not ffmpeg_exists: - QMessageBox.warning(self, '请下载ffmpeg!', '请将ffmpeg.exe放在resource目录下再录制!') - self.show() - - def setupUi(self): - self.centralwidget = QWidget(self) - self.centralwidget.setObjectName("centralwidget") - self.label0 = QLabel(self.centralwidget) - self.label0.setGeometry(QRect(0, 0, 421, 351)) - self.label0.setObjectName("scrollArea") - # 添加边框 - self.label0.setFrameShape(QFrame.Box) - self.label0.setFrameShadow(QFrame.Sunken) - self.get_screen_grab((0, 0, self.screen_x, self.screen_y)) - self.label0.setAlignment(Qt.AlignCenter) - self.label_1 = QLabel(self.centralwidget) - font = QFont() - font.setBold(True) - self.label_1.setGeometry(QRect(430, 0, 85, 31)) - self.label_1.setTextFormat(Qt.AutoText) - self.label_1.setFont(font) - self.label_1.setScaledContents(True) - self.label_1.setObjectName("屏幕录制器") - self.label_6 = QLabel(self.centralwidget) - self.label_6.setGeometry(QRect(430, 20, 85, 31)) - self.label_6.setTextFormat(Qt.AutoText) - self.label_6.setScaledContents(True) - self.label_6.setObjectName("注释1") - self.checkbox = QCheckBox(self.centralwidget) - self.checkbox.setGeometry(QRect(430, 100, 85, 20)) - self.checkbox.setChecked(True) - self.checkbox.stateChanged.connect(self.mouse_draw) - self.checkbox.setObjectName("录制鼠标") - self.comboBox = QComboBox(self.centralwidget) - self.comboBox.setGeometry(QRect(430, 200, 85, 20)) - self.comboBox.setEditable(False) - self.comboBox.addItems(self.audio.input_dict.keys()) - self.comboBox.addItems(['无']) - self.comboBox.setMaxVisibleItems(9) - self.comboBox.currentTextChanged.connect(self.change_combox) - self.comboBox.setObjectName("音频来源") - self.comboBox_3 = QComboBox(self.centralwidget) - self.comboBox_3.setGeometry(QRect(430, 260, 80, 20)) - self.comboBox_3.addItems(['双声道', '单声道']) - self.comboBox_3.currentIndexChanged.connect(self.change_combox) - self.comboBox_3.setObjectName("声道设置") - self.pushButton = QPushButton(self.centralwidget) - self.pushButton.setGeometry(QRect(470, 320, 41, 31)) - self.pushButton.clicked.connect(self.stop) - self.pushButton.setObjectName("停止") - self.pushButton_2 = QPushButton(self.centralwidget) - self.pushButton_2.setGeometry(QRect(430, 320, 41, 31)) - self.pushButton_2.setObjectName("开始") - self.pushButton_2.clicked.connect(self.start) - self.pushButton_3 = QPushButton(self.centralwidget) - self.pushButton_3.setGeometry(QRect(430, 290, 80, 23)) - self.pushButton_3.setObjectName("保存目录") - self.pushButton_3.clicked.connect(self.open_dirpath) - self.pushButton_4 = QPushButton(self.centralwidget) - self.pushButton_4.setGeometry(QRect(430, 70, 80, 23)) - self.pushButton_4.setCheckable(True) - self.pushButton_4.setObjectName("Size") - self.pushButton_4.clicked.connect(self.get_screen_area) - self.spinBox = QSpinBox(self.centralwidget) - self.spinBox.setValue(15) - self.spinBox.setRange(10, 60) - self.spinBox.setGeometry(QRect(430, 145, 80, 20)) - self.spinBox.valueChanged.connect(self.screen_fps_mofify) - self.spinBox.setObjectName("spinBox") - self.label_2 = QLabel(self.centralwidget) - self.label_2.setGeometry(QRect(430, 50, 54, 16)) - self.label_2.setTextFormat(Qt.AutoText) - self.label_2.setObjectName("选择区域") - self.label_3 = QLabel(self.centralwidget) - self.label_3.setGeometry(QRect(430, 125, 54, 16)) - self.label_3.setObjectName("帧率") - self.label_4 = QLabel(self.centralwidget) - self.label_4.setGeometry(QRect(430, 240, 54, 16)) - self.label_4.setObjectName("声道设置") - self.label_5 = QLabel(self.centralwidget) - self.label_5.setGeometry(QRect(430, 180, 54, 16)) - self.label_5.setObjectName("音频来源") - self.setCentralWidget(self.centralwidget) - - self.retranslateUi() - QMetaObject.connectSlotsByName(self) - - def retranslateUi(self): - self.pushButton.setText("停止") - self.pushButton_2.setText("开始") - self.pushButton_3.setText("保存目录") - self.pushButton_4.setText("Size*Size") - self.checkbox.setText("录制鼠标") - self.label_1.setText("屏幕录制器") - self.label_2.setText("选择区域:") - self.label_3.setText("帧率:") - self.label_4.setText("声道设置:") - self.label_5.setText("音频来源:") - self.label_6.setText("F7:开始/停止") - - def keyPressEvent(self, event): - """监测键盘是否按下F3,如果已开始录制则停止,否则开始录制""" - if event.key() == Qt.Key_F7: - if not self.hotkey_start: - self.start() - else: - self.stop() - - def change_combox(self, event): - sendername = self.sender().objectName() - if sendername == '声道设置': - self.channels = 2 if event == 0 else 1 - elif sendername == '音频来源': - if event == '无': - self.record_audio = False - else: - self.record_audio = True - self.device_name = event - - def get_screen_grab(self, crop_size): - # 获取屏幕截图并更新至self.label0中 - screen = ImageGrab.grab().convert('RGBA') - screen = screen.crop(box=crop_size) # box=(left, upper, right, lower) - data = screen.tobytes("raw", "RGBA") - qim = QImage(data, screen.size[0], screen.size[1], QImage.Format_RGBA8888) - pix = QPixmap.fromImage(qim).scaled(self.label0.size(), aspectRatioMode=Qt.KeepAspectRatio) - pix.detach() # QPixmap为另开线程操作的,避免程序崩溃,使用detach方法使用一个QImage对象直到QPixmap对象销毁 - self.label0.setPixmap(pix) - self.label0.repaint() - return screen.size - - def get_screen_area(self): - # 获取截图区间 - SizeScreen = MousePaint() - SizeScreen.exec_() - self.offset_x, self.offset_y = SizeScreen.lastpoint - end_x, end_y = SizeScreen.endpoint - self.screen_x, self.screen_y = self.get_screen_grab((self.offset_x, self.offset_y, end_x, end_y)) - self.screenshot.config_modify(offset_x=self.offset_x, offset_y=self.offset_y, - width=self.screen_x, height=self.screen_y) - self.pushButton_4.setText(f'{self.screen_x}*{self.screen_y}') - - def screen_fps_mofify(self, fps): - self.screenshot.config_modify(fps=fps) - - def mouse_draw(self, checked): - draw_mouse = 1 if checked else 0 - self.screenshot.config_modify(draw_mouse=draw_mouse) - - def open_dirpath(self): - fdir = QFileDialog.getExistingDirectory(self, '选择目录', self._dir) - if not fdir: - return None - self._dir = fdir - self.set_filename() - - def set_filename(self): - self.fname = f'{self._dir}/屏幕录制缓存_{int(datetime.now().replace(microsecond=0).timestamp())}' - self.screenshot.config_modify(filename=self.fname) - self.audio = AudioRecord() - self.setWindowTitle(f'屏幕录制 {self.fname}') - - def start(self): - if self.hotkey_start: - return - if not self.fname: - QMessageBox.warning(self, '请选择保存目录!', '请选择保存目录!') - return - self.screenshot.start() - if self.record_audio: - self.audio.stop_flag = False - self.audio.run(filename=self.fname + '.mp3', name=self.device_name) - self.hotkey_start = True - - def stop(self): - if not self.hotkey_start: - return - self.audio.stop_flag = True - self.hotkey_start = False - self.screenshot.stop() - if self.record_audio: - self.screenshot.compose() - else: - filename = self.fname + '.mp4' - target = filename.replace('缓存', '') - Path(filename).replace(target) - self.set_filename() - - -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.bline = 0 - event.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.lastpoint - pp.drawRect(lpx, lpy, self.pos[0] - lpx, self.pos[1] - lpy) - event.accept() - - -# def main(): -# """运行函数""" -# # 将7zip压缩格式添加到shutil中 -# shutil.register_archive_format('7zip', pack_7zarchive, description='7zip archive') -# shutil.register_unpack_format('7zip', ['.7z'], unpack_7zarchive, description='7zip archive') -# app = QApplication(sys.argv) -# app.setAttribute(Qt.AA_UseHighDpiPixmaps) -# ui = Ui_MainWindow1() -# sys.exit(app.exec_()) - - -#if __name__ == '__main__': -# main() diff --git a/src/qt/Screenshot/Screenshot_record.py b/src/qt/Screenshot/Screenshot_record.py deleted file mode 100644 index afe8094..0000000 --- a/src/qt/Screenshot/Screenshot_record.py +++ /dev/null @@ -1,67 +0,0 @@ -""" -使用ffmpeg录制屏幕,并结合Pyaudio同步录制的音频合成带有声音的视频文件 -""" -import sys -from pathlib import Path -from time import sleep -import ffmpeg - - -def file_path(filename): - relative_path = Path('resource').joinpath(filename) - if getattr(sys, 'frozen', False): - base_path = Path(sys.MEIPASS) - else: - base_path = Path('.').absolute() - return Path(base_path).joinpath(relative_path).as_posix() - - -class Screenshot: - - def __init__(self, width=1920, height=1080, fps=15): - self.width = width - self.height = height - self.fps = fps - self.process = None - self.ffmpeg_path = file_path('ffmpeg.exe') - - def __call__(self, width, height, fps=None): - self.width = width - self.height = height - self.fps = fps if fps else self.fps - - @staticmethod - def unlink(filename): - Path(filename).unlink() - - def record(self, filename, offset_x=0, offset_y=0, draw_mouse=0): - self.process = ( - ffmpeg.output( - ffmpeg.input( - filename='desktop', format='gdigrab', framerate=self.fps, offset_x=offset_x, offset_y=offset_y, - draw_mouse=draw_mouse, s=f'{self.width}x{self.height}'), - filename=filename, pix_fmt='yuv420p' - ).overwrite_output() - ) - self.ffmpeg_async() - - def compose_audio(self, video_path, audio_path, output_path): - self.process = ( - ffmpeg.output( - ffmpeg.input(filename=video_path), - ffmpeg.input(filename=audio_path), - filename=output_path, vcodec='copy', acodec='aac', strict='experimental', pix_fmt='yuv420p' - ).overwrite_output() - ) - sleep(1) - self.ffmpeg_async() - - def ffmpeg_async(self): - self.process = self.process.run_async(cmd=self.ffmpeg_path, pipe_stdin=True, pipe_stdout=False, - pipe_stderr=False) - - def terminate(self): - if self.process is not None: - self.process.communicate(str.encode("q")) - self.process.terminate() - self.process = None diff --git a/src/qt/Screenshot/Screenshot_record_with_cv2.py b/src/qt/Screenshot/Screenshot_record_with_cv2.py deleted file mode 100644 index 8f6a136..0000000 --- a/src/qt/Screenshot/Screenshot_record_with_cv2.py +++ /dev/null @@ -1,151 +0,0 @@ -import time -from pathlib import Path -from threading import Thread - -import cv2 -import numpy as np -from PIL import ImageGrab -from numba import jit -from pynput import keyboard - - -@jit(nopython=True) -def average_n(x, y): - """Numpy计算趋近值""" - return ((x + y + y) // 3).astype(x.dtype) - - -class ScreenshotVideo(Thread): - - def __init__(self, width, high, path='', fps=15): - """初始化参数""" - super().__init__() - self.save_file = path - self.best_fps = fps - self.fps = fps - self.width = width - self.high = high - self.spend_time = 1 - self.flag = False - self.kill = False - self.video = None - - def __call__(self, path): - """重载视频路径,便于类的二次调用""" - self.save_file = Path(path) - self.video = self.init_videowriter(self.save_file) - - @staticmethod - def screenshot(): - """静态方法,屏幕截图,并转换为np.array数组""" - return np.array(ImageGrab.grab()) - - @staticmethod - def get_fourcc(name): - """视频编码字典""" - fourcc_maps = {'.avi': 'I420', - '.m4v': 'mp4v', - '.mp4': 'avc1', - '.ogv': 'THEO', - '.flv': 'FLV1', - } - return fourcc_maps.get(name) - - def init_videowriter(self, path): - """获取视频编码并新建视频文件""" - if not path: - raise Exception('视频路径未设置,请设置\nvideo = ScreenshotVideo(fps,width,high)\nvideo = video(video_path)') - path = Path(path) if isinstance(path, str) else path - fourcc = cv2.VideoWriter_fourcc(*self.get_fourcc(path.suffix)) - return cv2.VideoWriter(path.as_posix(), fourcc, self.fps, (self.width, self.high)) - - def video_record_doing(self, img): - """将BGR数组转换为RGB数组""" - im_cv = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) - self.video.write(im_cv) - - def video_record_end(self): - """录制结束,根据条件判断文件是否保存""" - self.video.release() - cv2.destroyAllWindows() - if self.save_file and self.kill: - Path(self.save_file).unlink() - - def video_best_fps(self, path): - """获取电脑录制视频的最优帧率""" - video = cv2.VideoCapture(path) - fps = video.get(cv2.CAP_PROP_FPS) - count = video.get(cv2.CAP_PROP_FRAME_COUNT) - self.best_fps = int(fps * ((int(count) / fps) / self.spend_time)) - video.release() - - def pre_video_record(self): - """预录制,以获取最佳fps值""" - self.video = self.init_videowriter('test.mp4') - start_time = time.time() - for _ in range(10): - im = self.screenshot() - self.video_record_doing(im) - self.spend_time = round(time.time() - start_time, 4) - self.video_record_end() - time.sleep(2) - self.video_best_fps('test.mp4') - Path('test.mp4').unlink() - - def insert_frame_array(self, frame_list): - """Numpy增强截图信息""" - fps_n = round(self.fps / self.best_fps) - if fps_n <= 0: - return frame_list - times = int(np.log2(fps_n)) # 倍率 - for _ in range(times): - frame_list2 = map(average_n, [frame_list[0]] + frame_list[:-1], frame_list) - frame_list = [[x, y] for x, y in zip(frame_list2, frame_list)] - frame_list = [j for i in frame_list for j in i] - return frame_list - - def frame2video_run(self): - """使用opencv将连续型截图转换为视频""" - self.video = self.init_videowriter(self.save_file) - start_time = time.time() - frame_list = [] - while True: - frame_list.append(self.screenshot()) - if self.flag: - break - self.spend_time = round(time.time() - start_time, 4) - if not self.kill: # 视频录制不被终止将逐帧处理图像 - frame_list = self.insert_frame_array(frame_list) - for im in frame_list: - self.video_record_doing(im) - self.video_record_end() - - def hotkey(self): - """热键监听""" - with keyboard.Listener(on_press=self.on_press) as listener: - listener.join() - - def on_press(self, key): - try: - if key.char == 't': # 录屏结束,保存视频 - self.flag = True - elif key.char == 'k': # 录屏中止,删除文件 - self.flag = True - self.kill = True - except Exception as e: - print(e) - - def run(self): - # 运行函数 - # 设置守护线程 - Thread(target=self.hotkey, daemon=True).start() - # 运行截图函数 - self.frame2video_run() - - -screen = ImageGrab.grab() -width, high = screen.size -video = ScreenshotVideo(width, high, fps=60) -video.pre_video_record() # 预录制获取最优fps -video('test1.mp4') -video.run() diff --git a/src/qt/Screenshot/Screenshot_test.py b/src/qt/Screenshot/Screenshot_test.py deleted file mode 100644 index 0f8276f..0000000 --- a/src/qt/Screenshot/Screenshot_test.py +++ /dev/null @@ -1,32 +0,0 @@ -from threading import Thread - -from pynput import keyboard # pip install pynput - -from Audio_record import AudioRecord -from Screenshot_record import Screenshot - - -def hotkey(): - """热键监听""" - with keyboard.Listener(on_press=on_press) as listener: - listener.join() - - -def on_press(key): - try: - video.terminate() - if key.char == 't': # t键,录制结束,保存音视频 - audio.stop_flag = True - elif key.char == 'k': # k键,录制中止,删除文件 - audio.stop_flag = True - audio.kill = True - video.unlink('test.mp4') - except Exception as e: - print(e) - - -key_thread = Thread(target=hotkey, daemon=True) -audio = AudioRecord() -video = Screenshot() -key_thread.start() -video.record('test.mp4') diff --git a/src/qt/Screenshot/requirements.txt b/src/qt/Screenshot/requirements.txt deleted file mode 100644 index e36e104..0000000 --- a/src/qt/Screenshot/requirements.txt +++ /dev/null @@ -1,9 +0,0 @@ -ffmpeg-python==0.2.0 -numba==0.54.1 -numpy==1.20.3 -opencv-python==4.5.4.60 -Pillow==8.4.0 -PyAudio -pynput==1.7.5 -PyQt5==5.15.4 -py7zr==0.18.4 diff --git a/src/qt/Screenshot/resource/ffmpeg.7z b/src/qt/Screenshot/resource/ffmpeg.7z deleted file mode 100644 index 80bad7c..0000000 Binary files a/src/qt/Screenshot/resource/ffmpeg.7z and /dev/null differ diff --git a/src/qt/Screenshot/resource/ffmpeg.exe b/src/qt/Screenshot/resource/ffmpeg.exe deleted file mode 100644 index 71b5352..0000000 Binary files a/src/qt/Screenshot/resource/ffmpeg.exe and /dev/null differ diff --git a/src/qt/Screenshot/resource/gui_ico.ico b/src/qt/Screenshot/resource/gui_ico.ico deleted file mode 100644 index 4a5fb69..0000000 Binary files a/src/qt/Screenshot/resource/gui_ico.ico and /dev/null differ diff --git a/src/qt/__pycache__/app.cpython-39.pyc b/src/qt/__pycache__/app.cpython-39.pyc new file mode 100644 index 0000000..c87f752 Binary files /dev/null and b/src/qt/__pycache__/app.cpython-39.pyc differ diff --git a/src/qt/__pycache__/base.cpython-39.pyc b/src/qt/__pycache__/base.cpython-39.pyc new file mode 100644 index 0000000..30a5cc2 Binary files /dev/null and b/src/qt/__pycache__/base.cpython-39.pyc differ diff --git a/src/qt/__pycache__/config.cpython-39.pyc b/src/qt/__pycache__/config.cpython-39.pyc new file mode 100644 index 0000000..4f2b8fb Binary files /dev/null and b/src/qt/__pycache__/config.cpython-39.pyc differ diff --git a/src/qt/__pycache__/findpath_UI.cpython-39.pyc b/src/qt/__pycache__/findpath_UI.cpython-39.pyc index 46c924e..b4ab9d4 100644 Binary files a/src/qt/__pycache__/findpath_UI.cpython-39.pyc and b/src/qt/__pycache__/findpath_UI.cpython-39.pyc differ diff --git a/src/qt/__pycache__/screen_record_thread.cpython-39.pyc b/src/qt/__pycache__/screen_record_thread.cpython-39.pyc new file mode 100644 index 0000000..99dba0d Binary files /dev/null and b/src/qt/__pycache__/screen_record_thread.cpython-39.pyc differ diff --git a/src/qt/app.py b/src/qt/app.py new file mode 100644 index 0000000..115bb56 --- /dev/null +++ b/src/qt/app.py @@ -0,0 +1,171 @@ +# _*_ coding:utf-8 _*_ +import shutil +from PIL import ImageGrab +from PyQt5.QtCore import QCoreApplication, Qt, qAbs, QRect, QPoint +from PyQt5.QtGui import QPen, QPainter, QIcon, QFont, QColor, QPixmap +from PyQt5.QtWidgets import QPushButton, QHBoxLayout, QLabel, QVBoxLayout, QCheckBox, QMessageBox, QFileDialog, QDialog, \ + QApplication, QWidget, QDesktopWidget + +from base import Base +from config import ABSOLUTE_PATH +from screen_record_thread import ScreenRecordThread, SaveMp4Thread + + +class ScreenBar(Base): + def __init__(self): + super(ScreenBar, self).__init__() + self.box = QVBoxLayout() + self.btn_box = QHBoxLayout() + self.tip_label = QLabel(' 屏幕录制 ') + self.is_record_full = QCheckBox() + self.open_btn = QPushButton() + self.start_btn = QPushButton() + self.end_btn = QPushButton() + self.close_btn = QPushButton() + self.recording_thread = ScreenRecordThread() + self.offset_x = 0 + self.offset_y = 0 + self.end_x = 0 + self.end_y = 0 + self.bind() + self.set_style() + + def set_style(self): + self.start_btn.setEnabled(False) + self.end_btn.setEnabled(False) + self.start_btn.setIcon(QIcon('screenshot_png/start.png')) + self.end_btn.setIcon(QIcon('screenshot_png/stop.png')) + self.close_btn.setIcon(QIcon('screenshot_png/close.png')) + self.is_record_full.setIcon(QIcon('screenshot_png/full.png')) + self.open_btn.setIcon(QIcon('screenshot_png/rect.png')) + self.btn_box.addWidget(self.is_record_full, 0) + self.btn_box.addWidget(self.open_btn, 0) + self.btn_box.addWidget(self.start_btn, 0) + self.btn_box.addWidget(self.end_btn, 0) + self.btn_box.addWidget(self.close_btn, 0) + self.box.addWidget(self.tip_label) + self.box.addLayout(self.btn_box) + self.box.setContentsMargins(0, 0, 0, 0) + self.setWindowOpacity(0.7) + self.frameGeometry() + self.move(QApplication.desktop().frameGeometry().width() - 300, + QApplication.desktop().frameGeometry().height() - 150) + self.setLayout(self.box) + + def thread_trigger_signal(self, list, fps, gif_list): + def show_success_message(str): + QMessageBox.information(self, "提示", str, QMessageBox.Yes) + self.end_btn.setEnabled(False) + self.open_btn.setEnabled(True) + self.is_record_full.setEnabled(True) + + path, tmp = QFileDialog.getSaveFileName(self, + "文件保存", + '%s/*.mp4' % ABSOLUTE_PATH, + "All Files (*);") + if not '' == path: + if not path.endswith(".mp4"): + path = path + ".mp4" + self.save_mp4_thread = SaveMp4Thread(list, fps, path, gif_list) + self.save_mp4_thread.trigger.connect(lambda: show_success_message("保存成功")) + self.save_mp4_thread.start() + else: + show_success_message("取消保存") + shutil.rmtree('temp') + + def bind(self): + def open_signal(): + SizeScreen = MousePaint() + SizeScreen.exec_() + self.offset_x, self.offset_y = SizeScreen.lastpoint + self.end_x, self.end_y = SizeScreen.endpoint + self.start_btn.setEnabled(True) + self.is_record_full.setEnabled(False) + + def start_signal(): + self.open_btn.setEnabled(False) + self.start_btn.setEnabled(False) + self.end_btn.setEnabled(True) + self.recording_thread.recording = True + if self.is_record_full.isChecked(): + self.recording_thread.area = None + self.recording_thread.start() + else: + self.recording_thread.area = (self.offset_x, self.offset_y, self.end_x, self.end_y) + self.recording_thread.start() + + def end_signal(): + self.recording_thread.recording = False + + def record_full_signal(): + if self.is_record_full.isChecked(): + self.open_btn.setEnabled(False) + self.start_btn.setEnabled(True) + else: + self.open_btn.setEnabled(True) + self.start_btn.setEnabled(False) + + self.open_btn.clicked.connect(open_signal) + self.start_btn.clicked.connect(start_signal) + self.end_btn.clicked.connect(end_signal) + self.close_btn.clicked.connect(lambda: self.close()) + self.is_record_full.stateChanged.connect(record_full_signal) + self.recording_thread.trigger.connect(self.thread_trigger_signal) + +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.bline = 0 + event.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.lastpoint + pp.drawRect(lpx, lpy, self.pos[0] - lpx, self.pos[1] - lpy) + event.accept() diff --git a/src/qt/base.py b/src/qt/base.py new file mode 100644 index 0000000..32c552a --- /dev/null +++ b/src/qt/base.py @@ -0,0 +1,23 @@ +# _*_ coding:utf-8 _*_ +from PyQt5.QtCore import Qt +from PyQt5.QtWidgets import QWidget, QApplication + + +class Base(QWidget): + def __init__(self): + super(Base, self).__init__() + self.mMoveing = True + self.mMovePosition = self.pos() + self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint) + + def mousePressEvent(self, QMouseEvent): + self.mMoveing = True + self.mMovePosition = QMouseEvent.globalPos() - self.pos() + return super().mousePressEvent(QMouseEvent) + + def mouseMoveEvent(self, QMouseEvent): + if self.mMoveing and (QMouseEvent.buttons() and Qt.LeftButton) and ( + QMouseEvent.globalPos() - self.mMovePosition).manhattanLength() > QApplication.startDragDistance(): + self.move(QMouseEvent.globalPos() - self.mMovePosition) + self.mMovePosition = QMouseEvent.globalPos() - self.pos() + return super().mouseMoveEvent(QMouseEvent) diff --git a/src/qt/config.py b/src/qt/config.py new file mode 100644 index 0000000..69743ec --- /dev/null +++ b/src/qt/config.py @@ -0,0 +1,6 @@ +# _*_ coding:utf-8 _*_ +import os + +ABSOLUTE_PATH = os.path.dirname(os.path.realpath(__file__)).replace('\\', '/') + + diff --git a/src/qt/findpath_UI.py b/src/qt/findpath_UI.py index d3a2918..067e995 100644 --- a/src/qt/findpath_UI.py +++ b/src/qt/findpath_UI.py @@ -20,60 +20,67 @@ class Ui_MainWindow1(object): MainWindow.resize(1262, 867) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") - self.frame = QtWidgets.QFrame(self.centralwidget) - self.frame.setGeometry(QtCore.QRect(370, 770, 421, 70)) - self.frame.setStyleSheet("QPushButton{\n" + #设置左侧工具栏 + self.vedio_control_bar = QtWidgets.QFrame(self.centralwidget) + self.vedio_control_bar.setGeometry(QtCore.QRect(370, 770, 421, 70)) + self.vedio_control_bar.setStyleSheet("QPushButton{\n" " border:none\n" "}") - self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel) - self.frame.setFrameShadow(QtWidgets.QFrame.Raised) - self.frame.setObjectName("frame") - self.horizontalLayout = QtWidgets.QHBoxLayout(self.frame) + self.vedio_control_bar.setFrameShape(QtWidgets.QFrame.StyledPanel) + self.vedio_control_bar.setFrameShadow(QtWidgets.QFrame.Raised) + self.vedio_control_bar.setObjectName("vedio_control_bar") + self.horizontalLayout = QtWidgets.QHBoxLayout(self.vedio_control_bar) self.horizontalLayout.setObjectName("horizontalLayout") - self.pushButton = QtWidgets.QPushButton(self.frame) - self.pushButton.setMinimumSize(QtCore.QSize(50, 50)) - self.pushButton.setMaximumSize(QtCore.QSize(50, 50)) - self.pushButton.setText("") + #设置快退按钮 + self.vedio_back = QtWidgets.QPushButton(self.vedio_control_bar) + self.vedio_back.setMinimumSize(QtCore.QSize(50, 50)) + self.vedio_back.setMaximumSize(QtCore.QSize(50, 50)) + self.vedio_back.setText("") icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap("window_png/快退.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.pushButton.setIcon(icon) - self.pushButton.setIconSize(QtCore.QSize(50, 50)) - self.pushButton.setObjectName("pushButton") - self.horizontalLayout.addWidget(self.pushButton) - self.pushButton_2 = QtWidgets.QPushButton(self.frame) - self.pushButton_2.setMinimumSize(QtCore.QSize(50, 50)) - self.pushButton_2.setMaximumSize(QtCore.QSize(50, 50)) - self.pushButton_2.setText("") + self.vedio_back.setIcon(icon) + self.vedio_back.setIconSize(QtCore.QSize(50, 50)) + self.vedio_back.setObjectName("vedio_back") + self.horizontalLayout.addWidget(self.vedio_back) + #设置播放按钮 + self.vedio_play = QtWidgets.QPushButton(self.vedio_control_bar) + self.vedio_play.setMinimumSize(QtCore.QSize(50, 50)) + self.vedio_play.setMaximumSize(QtCore.QSize(50, 50)) + self.vedio_play.setText("") icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap("window_png/播放.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.pushButton_2.setIcon(icon1) - self.pushButton_2.setIconSize(QtCore.QSize(50, 50)) - self.pushButton_2.setObjectName("pushButton_2") - self.horizontalLayout.addWidget(self.pushButton_2) - self.pushButton_3 = QtWidgets.QPushButton(self.frame) - self.pushButton_3.setMinimumSize(QtCore.QSize(50, 50)) - self.pushButton_3.setMaximumSize(QtCore.QSize(50, 50)) - self.pushButton_3.setText("") + self.vedio_play.setIcon(icon1) + self.vedio_play.setIconSize(QtCore.QSize(50, 50)) + self.vedio_play.setObjectName("vedio_play") + self.horizontalLayout.addWidget(self.vedio_play) + #设置快进按钮 + self.vedio_forward = QtWidgets.QPushButton(self.vedio_control_bar) + self.vedio_forward.setMinimumSize(QtCore.QSize(50, 50)) + self.vedio_forward.setMaximumSize(QtCore.QSize(50, 50)) + self.vedio_forward.setText("") icon2 = QtGui.QIcon() icon2.addPixmap(QtGui.QPixmap("window_png/快进.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.pushButton_3.setIcon(icon2) - self.pushButton_3.setIconSize(QtCore.QSize(50, 50)) - self.pushButton_3.setObjectName("pushButton_3") - self.horizontalLayout.addWidget(self.pushButton_3) + self.vedio_forward.setIcon(icon2) + self.vedio_forward.setIconSize(QtCore.QSize(50, 50)) + self.vedio_forward.setObjectName("vedio_forward") + self.horizontalLayout.addWidget(self.vedio_forward) self.widget = QVideoWidget(self.centralwidget) self.widget.setGeometry(QtCore.QRect(10, 20, 1191, 691)) self.widget.setObjectName("widget") - self.frame_2 = QtWidgets.QFrame(self.centralwidget) - self.frame_2.setGeometry(QtCore.QRect(10, 710, 1201, 61)) - self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel) - self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised) - self.frame_2.setObjectName("frame_2") - self.sld_duration = QtWidgets.QSlider(self.frame_2) + #设置进度条窗口 + self.Progress_bar = QtWidgets.QFrame(self.centralwidget) + self.Progress_bar.setGeometry(QtCore.QRect(10, 710, 1201, 61)) + self.Progress_bar.setFrameShape(QtWidgets.QFrame.StyledPanel) + self.Progress_bar.setFrameShadow(QtWidgets.QFrame.Raised) + self.Progress_bar.setObjectName("Progress_bar") + #设置进度条控件 + self.sld_duration = QtWidgets.QSlider(self.Progress_bar) self.sld_duration.setGeometry(QtCore.QRect(20, 20, 1051, 22)) self.sld_duration.setOrientation(QtCore.Qt.Horizontal) self.sld_duration.setObjectName("sld_duration") self.sld_duration.setEnabled(True) - self.lab_duration = QtWidgets.QLabel(self.frame_2) + #设置显示时间控件 + self.lab_duration = QtWidgets.QLabel(self.Progress_bar) self.lab_duration.setGeometry(QtCore.QRect(1100, 20, 81, 21)) font = QtGui.QFont() font.setFamily("微软雅黑") @@ -95,11 +102,13 @@ class Ui_MainWindow1(object): self.toolBar.setIconSize(QtCore.QSize(40, 40)) self.toolBar.setObjectName("toolBar") MainWindow.addToolBar(QtCore.Qt.LeftToolBarArea, self.toolBar) + #设置添加文件按钮 self.actionl1 = QtWidgets.QAction(MainWindow) icon3 = QtGui.QIcon() icon3.addPixmap(QtGui.QPixmap("window_png/添加文件.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionl1.setIcon(icon3) self.actionl1.setObjectName("actionl1") + #设置路径分析按钮 self.actionl1_2 = QtWidgets.QAction(MainWindow) icon4 = QtGui.QIcon() icon4.addPixmap(QtGui.QPixmap("window_png/路径分析-2.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) @@ -107,20 +116,21 @@ class Ui_MainWindow1(object): self.actionl1_2.setObjectName("actionl1_2") self.toolBar.addAction(self.actionl1) self.toolBar.addAction(self.actionl1_2) - self.frame_3 = QtWidgets.QFrame(self.centralwidget) - self.frame_3.setGeometry(QtCore.QRect(800, 770, 150, 70)) - self.frame.setStyleSheet("QPushButton{\n" + self.vedio_bar = QtWidgets.QFrame(self.centralwidget) + self.vedio_bar.setGeometry(QtCore.QRect(800, 770, 150, 70)) + self.vedio_control_bar.setStyleSheet("QPushButton{\n" " border:none\n" "}") - self.frame_3.setFrameShape(QtWidgets.QFrame.StyledPanel) - self.frame_3.setFrameShadow(QtWidgets.QFrame.Raised) - self.frame_3.setObjectName("frame_3") - self.sld = QtWidgets.QSlider(self.frame_3) + self.vedio_bar.setFrameShape(QtWidgets.QFrame.StyledPanel) + self.vedio_bar.setFrameShadow(QtWidgets.QFrame.Raised) + self.vedio_bar.setObjectName("vedio_bar") + #设置音量调节进度条 + self.sld = QtWidgets.QSlider(self.vedio_bar) self.sld.setGeometry(QtCore.QRect(50, 20, 50, 30)) self.sld.setOrientation(QtCore.Qt.Horizontal) self.sld.setObjectName("sld") self.sld.setEnabled(True) - self.lab = QtWidgets.QLabel(self.frame_3) + self.lab = QtWidgets.QLabel(self.vedio_bar) self.lab.setGeometry(QtCore.QRect(100, 20, 40, 30)) font = QtGui.QFont() font.setFamily("微软雅黑") @@ -134,53 +144,54 @@ class Ui_MainWindow1(object): " color:white\n" "}") self.lab.setObjectName("lab") - self.pushButton_9 = QtWidgets.QPushButton(self.frame_3) - self.pushButton_9.setEnabled(False) - self.pushButton_9.move(0, 10) - self.pushButton_9.setMinimumSize(QtCore.QSize(50, 50)) - self.pushButton_9.setMaximumSize(QtCore.QSize(50, 50)) - self.pushButton_9.setText("") + self.vedio_voice = QtWidgets.QPushButton(self.vedio_bar) + self.vedio_voice.setEnabled(False) + self.vedio_voice.move(0, 10) + self.vedio_voice.setMinimumSize(QtCore.QSize(50, 50)) + self.vedio_voice.setMaximumSize(QtCore.QSize(50, 50)) + self.vedio_voice.setText("") icon9 = QtGui.QIcon() icon9.addPixmap(QtGui.QPixmap("window_png/音量.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.pushButton_9.setIcon(icon9) - self.pushButton_9.setIconSize(QtCore.QSize(50, 50)) - self.pushButton_9.setObjectName("pushButton_9") + self.vedio_voice.setIcon(icon9) + self.vedio_voice.setIconSize(QtCore.QSize(50, 50)) + self.vedio_voice.setObjectName("vedio_voice") self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) - + #设置槽函数 self.player = QMediaPlayer() self.player.setVideoOutput(self.widget) + #设置时间函数 self.timer = QTimer() self.timer.start(1000) self.timer.timeout.connect(lambda: self.onTimerOut()) self.actionl1.triggered.connect(lambda: self.openfile()) - self.pushButton_2.clicked.connect(lambda: self.playpause()) - self.pushButton_3.clicked.connect(lambda: self.uptime()) - self.pushButton.clicked.connect(lambda: self.downtime()) + self.vedio_play.clicked.connect(lambda: self.playpause()) + self.vedio_forward.clicked.connect(lambda: self.uptime()) + self.vedio_back.clicked.connect(lambda: self.downtime()) self.sld_duration.sliderMoved.connect(lambda: self.changetime()) self.sld.sliderMoved.connect(lambda: self.changevoice()) - + #点击添加文件事件 def openfile(self): media_list = QMediaContent(QFileDialog.getOpenFileUrl()[0]) self.player.setMedia(media_list) self.player.play() self.player.pause() - + #点击视频停止事件 def playpause(self): if self.player.state() == 1: self.player.pause() icon9 = QtGui.QIcon() icon9.addPixmap(QtGui.QPixmap("window_png/播放.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.pushButton_2.setIcon(icon9) - self.pushButton_2.setIconSize(QtCore.QSize(50, 50)) + self.vedio_play.setIcon(icon9) + self.vedio_play.setIconSize(QtCore.QSize(50, 50)) else: self.player.play() icon9 = QtGui.QIcon() icon9.addPixmap(QtGui.QPixmap("window_png/暂停.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.pushButton_2.setIcon(icon9) - self.pushButton_2.setIconSize(QtCore.QSize(50, 50)) - + self.vedio_play.setIcon(icon9) + self.vedio_play.setIconSize(QtCore.QSize(50, 50)) + #设置时间函数 def onTimerOut(self): alltime = self.player.duration() ms = self.player.position() @@ -193,20 +204,21 @@ class Ui_MainWindow1(object): self.sld_duration.setValue(ms) self.sld.setValue(self.player.volume()) self.lab.setText('{}%'.format(self.player.volume())) + #设置快进事件 def uptime(self): num = self.player.position() + int(self.player.duration() / 20) self.player.setPosition(num) - + #设置快退事件 def downtime(self): num = self.player.position() - int(self.player.duration() / 20) self.player.setPosition(num) - + #设置鼠标改变进度条事件 def changetime(self): self.timer.stop() num = self.sld_duration.value() self.player.setPosition(num) self.timer.start() - + #设置鼠标改变声音事件 def changevoice(self): num = self.sld.value() self.player.setVolume(num) diff --git a/src/qt/screen_record_thread.py b/src/qt/screen_record_thread.py new file mode 100644 index 0000000..cd24d39 --- /dev/null +++ b/src/qt/screen_record_thread.py @@ -0,0 +1,71 @@ +# _*_ coding:utf-8 _*_ +import time + +import os + +import shutil + +import win32gui +from PIL import ImageGrab, Image +from PyQt5.QtCore import QThread, pyqtSignal +from moviepy.video.io.ImageSequenceClip import ImageSequenceClip + + +class ScreenRecordThread(QThread): + trigger = pyqtSignal(list, int, list) + + def __init__(self): + super(ScreenRecordThread, self).__init__() + self.recording = True + self.area = None + self.save_path = '' + self.is_pause_for_save = True + self.recordTime = 0 + self.image_list = [] # mp4 list + self.image_gif_list = [] # gif list + + def run(self): + if not os.path.exists('temp'): + os.mkdir('temp') + else: + shutil.rmtree('temp') + os.mkdir('temp') + self.is_pause_for_save = True + self.recording = True + self.recordTime = 0 + self.image_list = [] + + t = time.time() + imCursor = Image.open('screenshot_png/cursor.png') + self.image_gif_list = [] + while self.recording: + curX, curY = win32gui.GetCursorPos() + if self.area is None: + image = ImageGrab.grab() + image.paste(imCursor, box=(curX, curY), mask=imCursor) + else: + image = ImageGrab.grab(self.area) + image.paste(imCursor, box=(curX - self.area[0], curY - self.area[1]), mask=imCursor) + imageName = os.path.join('temp', '%s.jpg' % int(time.time() * 1e3)) + image.save(imageName) + self.image_list.append(imageName) + self.recordTime = time.time() - t + fps = len(self.image_list) / self.recordTime + self.trigger.emit(self.image_list, fps, self.image_gif_list) + + +class SaveMp4Thread(QThread): + trigger = pyqtSignal() + + def __init__(self, list, fps, path, gif_list): + super(SaveMp4Thread, self).__init__() + self.fps = fps + self.path = path + self.list = list + self.gif_list = gif_list + + def run(self): + clip = ImageSequenceClip(self.list, fps=self.fps) + clip.write_videofile(self.path) # to video + self.trigger.emit() + shutil.rmtree('temp') diff --git a/src/qt/screenshot_png/close.png b/src/qt/screenshot_png/close.png new file mode 100644 index 0000000..d1f46b4 Binary files /dev/null and b/src/qt/screenshot_png/close.png differ diff --git a/src/qt/screenshot_png/cursor.png b/src/qt/screenshot_png/cursor.png new file mode 100644 index 0000000..f36f1ee Binary files /dev/null and b/src/qt/screenshot_png/cursor.png differ diff --git a/src/qt/screenshot_png/full.png b/src/qt/screenshot_png/full.png new file mode 100644 index 0000000..a7aa3c2 Binary files /dev/null and b/src/qt/screenshot_png/full.png differ diff --git a/src/qt/screenshot_png/rect.png b/src/qt/screenshot_png/rect.png new file mode 100644 index 0000000..b1d5f44 Binary files /dev/null and b/src/qt/screenshot_png/rect.png differ diff --git a/src/qt/screenshot_png/start.png b/src/qt/screenshot_png/start.png new file mode 100644 index 0000000..3ff1fae Binary files /dev/null and b/src/qt/screenshot_png/start.png differ diff --git a/src/qt/screenshot_png/stop.png b/src/qt/screenshot_png/stop.png new file mode 100644 index 0000000..dc6f445 Binary files /dev/null and b/src/qt/screenshot_png/stop.png differ diff --git a/src/qt/tello_png/hold.png b/src/qt/tello_png/hold.png new file mode 100644 index 0000000..3224639 Binary files /dev/null and b/src/qt/tello_png/hold.png differ diff --git a/src/qt/tello_png/return_2.png b/src/qt/tello_png/return_2.png new file mode 100644 index 0000000..ea6a11c Binary files /dev/null and b/src/qt/tello_png/return_2.png differ