pyqt5+Qtdesigner 制作一个多视频流的播放器

新手练习,本人渣渣。

先用Qtdesigner做一个UI界面。

 ui转为py。这句代码可以在终端直接转

pyuic5 -o four_camera_test.py four_camera_test.ui

 生成的py程序如下:文件名为 four_camera_test.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'four_camera_test.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.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1241, 658)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setContentsMargins(1, -1, 3, 5)
        self.horizontalLayout.setSpacing(32)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.btn_start = QtWidgets.QPushButton(self.centralwidget)
        self.btn_start.setObjectName("btn_start")
        self.horizontalLayout.addWidget(self.btn_start)
        self.btn_stop = QtWidgets.QPushButton(self.centralwidget)
        self.btn_stop.setObjectName("btn_stop")
        self.horizontalLayout.addWidget(self.btn_stop)
        self.btn_record = QtWidgets.QPushButton(self.centralwidget)
        self.btn_record.setObjectName("btn_record")
        self.horizontalLayout.addWidget(self.btn_record)
        self.btn_quit = QtWidgets.QPushButton(self.centralwidget)
        self.btn_quit.setObjectName("btn_quit")
        self.horizontalLayout.addWidget(self.btn_quit)
        self.splitter = QtWidgets.QSplitter(self.centralwidget)
        self.splitter.setOrientation(QtCore.Qt.Horizontal)
        self.splitter.setObjectName("splitter")
        self.lab_1 = QtWidgets.QLabel(self.splitter)
        self.lab_1.setObjectName("lab_1")
        self.lineEdit_File = QtWidgets.QLineEdit(self.splitter)
        self.lineEdit_File.setObjectName("lineEdit_File")
        self.btn_file = QtWidgets.QPushButton(self.splitter)
        self.btn_file.setObjectName("btn_file")
        self.horizontalLayout.addWidget(self.splitter)
        self.horizontalLayout.setStretch(4, 2)
        self.gridLayout_2.addLayout(self.horizontalLayout, 0, 0, 1, 1)
        self.splitter_2 = QtWidgets.QSplitter(self.centralwidget)
        self.splitter_2.setOrientation(QtCore.Qt.Horizontal)
        self.splitter_2.setObjectName("splitter_2")
        self.lab_rador = QtWidgets.QLabel(self.splitter_2)
        self.lab_rador.setMinimumSize(QtCore.QSize(600, 600))
        self.lab_rador.setMaximumSize(QtCore.QSize(800, 800))
        self.lab_rador.setObjectName("lab_rador")
        self.widget = QtWidgets.QWidget(self.splitter_2)
        self.widget.setObjectName("widget")
        self.gridLayout = QtWidgets.QGridLayout(self.widget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")
        self.lab_camera2 = QtWidgets.QLabel(self.widget)
        self.lab_camera2.setMaximumSize(QtCore.QSize(1000, 800))
        self.lab_camera2.setObjectName("lab_camera2")
        self.gridLayout.addWidget(self.lab_camera2, 0, 1, 1, 1)
        self.lab_camera3 = QtWidgets.QLabel(self.widget)
        self.lab_camera3.setMaximumSize(QtCore.QSize(1000, 800))
        self.lab_camera3.setObjectName("lab_camera3")
        self.gridLayout.addWidget(self.lab_camera3, 1, 0, 1, 1)
        self.lab_camera1 = QtWidgets.QLabel(self.widget)
        self.lab_camera1.setMaximumSize(QtCore.QSize(1000, 800))
        self.lab_camera1.setObjectName("lab_camera1")
        self.gridLayout.addWidget(self.lab_camera1, 0, 0, 1, 1)
        self.lab_camera4 = QtWidgets.QLabel(self.widget)
        self.lab_camera4.setMaximumSize(QtCore.QSize(1000, 800))
        self.lab_camera4.setObjectName("lab_camera4")
        self.gridLayout.addWidget(self.lab_camera4, 1, 1, 1, 1)
        self.gridLayout_2.addWidget(self.splitter_2, 1, 0, 1, 1)
        self.gridLayout_2.setRowMinimumHeight(1, 1)
        self.gridLayout_2.setRowStretch(1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1241, 22))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.btn_start.setText(_translate("MainWindow", "开始"))
        self.btn_stop.setText(_translate("MainWindow", "暂停"))
        self.btn_record.setText(_translate("MainWindow", "保存"))
        self.btn_quit.setText(_translate("MainWindow", "退出"))
        self.lab_1.setText(_translate("MainWindow", "         保存位置"))
        self.btn_file.setText(_translate("MainWindow", ".........."))
        self.lab_rador.setText(_translate("MainWindow", "TextLabel"))
        self.lab_camera2.setText(_translate("MainWindow", "TextLabel"))
        self.lab_camera3.setText(_translate("MainWindow", "TextLabel"))
        self.lab_camera1.setText(_translate("MainWindow", "TextLabel"))
        self.lab_camera4.setText(_translate("MainWindow", "TextLabel"))

执行程序如下:

from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import QTimer,QCoreApplication
from PyQt5.QtMultimedia import QMediaContent,QMediaPlayer
from PyQt5.QtWidgets import QMainWindow,QFileDialog,QApplication
from four_camera_test import Ui_MainWindow

import cv2
import sys
import qimage2ndarray
import time

class FourCamera(QMainWindow,Ui_MainWindow):
    def __init__(self):
        super(FourCamera, self).__init__()
        self.setupUi(self)

        self.PreWidgets()     #
        self.PreParameters()   # 准备参数
        self.CallBackFunctions()

        self.Timer = QTimer()
        self.Timer.timeout.connect(self.TimerOutFun)

        self.player = QMediaPlayer()

    def PreWidgets(self):

        self.PreCamera()
        self.btn_stop.setEnabled(False)
        self.btn_record.setEnabled(False)


    def PreCamera(self):

        self.camera1 = cv2.VideoCapture('rtmp://live.yihtc.com:10935/hls/stream_3')
        self.camera2 = cv2.VideoCapture("rtmp://hls.hsrtv.cn/hls/hstv1")
        self.camera3 = cv2.VideoCapture('https://hls01open.ys7.com/openlive/6e0b2be040a943489ef0b9bb344b96b8.hd.m3u8')
        self.camera4 = cv2.VideoCapture("rtmp://livetv.dhtv.cn:1935/live/news")


    def PreParameters(self):
        self.RecordFlag = 0
        self.RecordPatn = 'E:/'
        self.lineEdit_File.setText(self.RecordPatn)

        self.Image_num = 0



    def CallBackFunctions(self):
        self.btn_file.clicked.connect(self.SetFilePath)  # 文件路径
        self.btn_start.clicked.connect(self.StartCamera)   # 开始
        self.btn_stop.clicked.connect(self.StopCamera)   # 暂停
        self.btn_record.clicked.connect(self.RecordCamera)   # 保存
        self.btn_quit.clicked.connect(self.ExitApp)       # 退出



    def StartCamera(self):
        self.btn_start.setEnabled(False)
        self.btn_stop.setEnabled(True)
        self.btn_record.setEnabled(True)
        self.btn_record.setText('录像')


        self.Timer.start(1)
        self.timelb = time.clock()

    def SetFilePath(self):
        dirname = QFileDialog.getExistingDirectory(self,'浏览','.')

        if dirname:
            self.FilePathLE.setText(dirname)
            self.RecordPatn = dirname + '/'

    def TimerOutFun(self):

        success1,img1 = self.camera1.read()
        success2,img2 = self.camera2.read()
        success3,img3 = self.camera3.read()
        success4,img4 = self.camera4.read()

        if success1 or success2 or success3 or success4:

            self.Image1 = img1
            self.Image2 = img2
            self.Image3 = img3
            self.Image4 = img4

            self.DispImg()
            self.Image_num += 1

            if self.Image_num % 10 == 9 :
                frame_rate = 10 / (time.clock() - self.timelb)
                self.timelb = time.clock()

    def DispImg(self):

        img1 = cv2.cvtColor(self.Image1,cv2.COLOR_BGR2RGB)
        img2 = cv2.cvtColor(self.Image2,cv2.COLOR_BGR2RGB)
        img3 = cv2.cvtColor(self.Image3,cv2.COLOR_BGR2RGB)
        img4 = cv2.cvtColor(self.Image4,cv2.COLOR_BGR2RGB)

        qimg1 = qimage2ndarray.array2qimage(img1)
        qimg2 = qimage2ndarray.array2qimage(img2)
        qimg3 = qimage2ndarray.array2qimage(img3)
        qimg4 = qimage2ndarray.array2qimage(img4)

        self.lab_camera1.setPixmap(QPixmap(qimg1))
        self.lab_camera1.show()

        self.lab_camera2.setPixmap(QPixmap(qimg2))
        self.lab_camera2.show()

        self.lab_camera3.setPixmap(QPixmap(qimg3))
        self.lab_camera3.show()

        self.lab_camera4.setPixmap(QPixmap(qimg4))
        self.lab_camera4.show()

    def StopCamera(self):
        if self.btn_stop.text()=='暂停':
            self.btn_stop.setText('继续')
            self.btn_record.setText('保存')
            self.Timer.stop()

        elif self.btn_stop.text()=='继续':
            self.btn_stop.setText('暂停')
            self.btn_record.setText('录像')
            self.Timer.start()


    def RecordCamera(self):
        tag = self.btn_record.text()
        if tag == '保存':
            image_name = self.RecordPatn + 'image' + time.strftime('%Y%m%d%H%M%S',time.localtime(time.time()))+'.jpg'
            print(image_name)
            cv2.imwrite(image_name,self.Image1)


        elif tag == '录像':
            self.btn_record.setText('停止')
            self.btn_record.setText('停止')

            video_name = self.RecordPath + 'video' + time.strftime('%Y%m%d%H%M%S', time.localtime(time.time())) + '.avi'
            fps = self.lcd_zhen.value()
            size = (self.Image.shape[1], self.Image.shape[0])
            fourcc = cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')
            self.video_writer = cv2.VideoWriter(video_name, fourcc, self.camera.get(5), size)
            self.RecordFlag = 1
            # self.MsgTE.setPlainText('Video recording...')
            self.btn_stop.setEnabled(False)
            self.btn_quit.setEnabled(False)


        elif tag == '停止':
            self.btn_record.setText('录像')
            self.video_writer.release()
            self.RecordFlag = 0
            # self.MsgTE.setPlainText('Video saved.')
            self.btn_stop.setEnabled(True)
            self.btn_quit.setEnabled(True)


    def ExitApp(self):
        self.Timer.stop()
        self.camera1.release()

        QCoreApplication.quit()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ui = FourCamera()
    ui.show()
    sys.exit(app.exec_())








运行结果如下:

 

本人新手,正在学习。后续会完善。

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值