Qt Designer设计界面三,Qlabel播放视频文件示例


功能:

1.播放,停止播放,循环播放一个视频文件

缺点:窗口大小固定不可调,因为一拉伸窗口就会导致程序停止运行,无解

效果图:

 代码:

import sys
import cv2, time
from threading import Thread
from PySide2.QtGui import QImage, QPixmap
from PySide2.QtCore import Qt
from PySide2.QtWidgets import (QApplication, QMainWindow)
from p import Ui_MainWindow


class UI(QMainWindow, Ui_MainWindow):

    def __init__(self):
        super(UI, self).__init__()
        self.setupUi(self)
        # 只保留窗口关闭按钮, 禁止拉伸窗口大小
        self.setWindowFlags(Qt.WindowCloseButtonHint)
        self.setFixedSize(self.width(), self.height())
        self.b_close = False
        self.b_loop = False
        self.video_lbl.setStyleSheet("background-color: black")
        self.play_tool.triggered.connect(lambda : Thread(target=self.play_video).start())
        self.stop_tool.triggered.connect(self.stop_video)
        self.loop_tool.triggered.connect(self.loop_video)

    def stop_video(self):
        if self.b_close == False:
            self.b_close = True
            self.b_loop = True
        self.play_tool.setEnabled(True)

    def loop_video(self):
        if self.loop_tool.text() == '循环播放中':
            self.b_loop = False
            self.loop_tool.setText('当前为不循环播放')
        else:
            self.b_loop = True
            self.loop_tool.setText('循环播放中')

    def play_video(self):
        '''
        功能:播放影片
        :return:
        '''
        self.play_tool.setEnabled(False)
        self.b_close = False
        file = '1.mp4'
        self.cap = cv2.VideoCapture(file)
        if not self.cap.isOpened():
            print('Cannot open video')
            return
        while not self.b_close:
            while True:
                # 此循环用于循环播放判断
                if self.b_close == True:
                    break
                try:
                    ret, frame = self.cap.read()
                    if not ret:
                        if frame is None:
                            print('The video has end')
                            self.video_lbl.clear()
                            # 如果不循环播放就跳出
                            if self.b_loop == False:
                                break
                            else:
                                self.cap.release()
                                time.sleep(0.2)
                                self.cap = cv2.VideoCapture(file)
                        else:
                            print('Read video error!')
                        break
                    width = self.video_lbl.size().width()
                    height = self.video_lbl.size().height()
                    frame = cv2.resize(frame, (width,height), interpolation=cv2.INTER_AREA)
                    self.frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
                    self.qt_img = QImage(self.frame.data, self.frame.shape[1], self.frame.shape[0], self.frame.shape[1] * 3,
                                    QImage.Format_RGB888)
                    self.video_lbl.setPixmap(QPixmap.fromImage(self.qt_img))
                except:
                    pass
            if self.b_loop == False:
                break

        self.cap.release()
        self.video_lbl.clear()
        self.play_tool.setEnabled(True)

if __name__ == '__main__':
    app = QApplication([])
    server = UI()
    server.show()
    sys.exit(app.exec_())