Python实现Qt单窗口双线程双视频播放

Python实现Qt单窗口双线程双视频播放

软件可用于单窗口多线程播放视频,可用于视频剪辑,播放,安防监控等等诸多应用场景。用途广泛,欢迎使用。

实现效果如下:

代码如下: 

main_video.py

from PyQt5.QtWidgets import *
from PyQt5.QtMultimedia import *
from VideoUi import VideoUi
from VideoWidget import VideoWidget
import sys

import threading 
 
class MainWindow(VideoUi, QMainWindow):
    def __init__(self):
        super(VideoUi, self).__init__()
        self.setupUi(self)
        self.videoFullScreen = False   # 判断当前widget是否全屏
        self.videoFullScreenWidget = VideoWidget()   # 创建一个全屏的widget
        self.videoFullScreenWidget.setFullScreen(1)
        self.videoFullScreenWidget.hide()               # 不用的时候隐藏起来
        self.player = QMediaPlayer()
        self.player.setVideoOutput(self.wgt_video)  # 视频播放输出的widget,就是上面定义的
        self.btn_open.clicked.connect(self.openVideoFile)   # 打开视频文件按钮
        self.btn_play.clicked.connect(self.playVideo)       # play
        self.btn_stop.clicked.connect(self.pauseVideo)       # pause
        self.player.positionChanged.connect(self.changeSlide)      # change Slide
        #self.videoFullScreenWidget.doubleClickedItem.connect(self.videoDoubleClicked)  #双击响应
        #self.wgt_video.doubleClickedItem.connect(self.videoDoubleClicked)   #双击响应

        self.player2 = QMediaPlayer()
        self.player2.setVideoOutput(self.wgt_video2)  # 视频播放输出的widget,就是上面定义的

    def openVideoFile(self):

        #play_thread = threading.Thread(target=self.player.play())
        #play_thread2 = threading.Thread(target=self.player2.play())
        self.player.setMedia(QMediaContent(QFileDialog.getOpenFileUrl()[0]))  # 选取视频文件
        #self.player.play()  # 播放视频

        self.player2.setMedia(QMediaContent(QFileDialog.getOpenFileUrl()[0]))  # 选取视频文件
        #self.player2.play()  # 播放视频 
        # 

        #play_thread.start()
        #play_thread2.start()       
 
    def playVideo(self):
        #self.player.play()
        #self.player2.play()

        play_thread = threading.Thread(target=self.player.play())
        play_thread2 = threading.Thread(target=self.player2.play())
        play_thread.start()
        play_thread2.start() 

    def pauseVideo(self):
        self.player.pause()
        self.player2.pause()

    def changeSlide(self,position):
        self.vidoeLength = self.player.duration()+0.1
        self.sld_video.setValue(round((position/self.vidoeLength)*100))
        self.lab_video.setText(str(round((position/self.vidoeLength)*100,2))+'%')

    def videoDoubleClicked(self,text):
        if self.player.duration() > 0:  # 开始播放后才允许进行全屏操作
            if self.videoFullScreen:
                self.player.pause()
                self.videoFullScreenWidget.hide()
                self.player.setVideoOutput(self.wgt_video)
                self.player.play()
                self.videoFullScreen = False
            else:
                self.player.pause()
                self.videoFullScreenWidget.show()
                self.player.setVideoOutput(self.videoFullScreenWidget)
                self.player.play()
                self.videoFullScreen = True
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    sys.exit(app.exec_())

VideoWidget.py

from PyQt5.QtMultimediaWidgets import QVideoWidget
from PyQt5.QtCore import *
class VideoWidget(QVideoWidget):
    doubleClickedItem = pyqtSignal(str)  # 创建双击信号
    def __init__(self,parent=None):
        super(QVideoWidget,self).__init__(parent)
    def mouseDoubleClickEvent(self,QMouseEvent):     #双击事件
        self.doubleClickedItem.emit("double clicked")

VideoUi.py

# -*- coding: utf-8 -*-
 
# Form implementation generated from reading ui file 'GUI.ui'
#
# Created by: PyQt5 UI code generator 5.6
#
# WARNING! All changes made in this file will be lost!
 
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QAction, qApp
from PyQt5.QtWidgets import (QWidget, QLabel, QLineEdit,
    QTextEdit, QGridLayout, QApplication)
from VideoWidget import VideoWidget
 
class VideoUi(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800*2, 650)
 
        #获取画布
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.centralwidget.setGeometry(QtCore.QRect(0,0,800,650))

        self.centralwidget2 = QtWidgets.QWidget(MainWindow)
        self.centralwidget2.setObjectName("centralwidget2") 
        self.centralwidget2.setGeometry(QtCore.QRect(801,0,800,650))               
 
        #视频播放控件
        self.wgt_video = VideoWidget(self.centralwidget)
        self.wgt_video.setGeometry(QtCore.QRect(0, 0, 800, 500))
        self.wgt_video.setObjectName("wgt_video")

        self.wgt_video2 = VideoWidget(self.centralwidget2)
        self.wgt_video2.setGeometry(QtCore.QRect(0, 0, 800, 500))
        self.wgt_video2.setObjectName("wgt_video2")        
 
        #选择文件按钮
        self.btn_open = QtWidgets.QPushButton(self.centralwidget)
        self.btn_open.setGeometry(QtCore.QRect(5, 570, 80, 30))
        self.btn_open.setObjectName("btn_open")

        self.btn_open2 = QtWidgets.QPushButton(self.centralwidget2)
        self.btn_open2.setGeometry(QtCore.QRect(5, 570, 80, 30))
        self.btn_open2.setObjectName("btn_open2")        
 
        #进度条
        self.sld_video = QtWidgets.QSlider(self.centralwidget)
        self.sld_video.setGeometry(QtCore.QRect(5, 530, 750, 30))
        self.sld_video.setMaximum(100)
        self.sld_video.setOrientation(QtCore.Qt.Horizontal)
        self.sld_video.setObjectName("sld_video")
 
        self.sld_video2 = QtWidgets.QSlider(self.centralwidget2)
        self.sld_video2.setGeometry(QtCore.QRect(5, 530, 750, 30))
        self.sld_video2.setMaximum(100)
        self.sld_video2.setOrientation(QtCore.Qt.Horizontal)
        self.sld_video2.setObjectName("sld_video2")

        #进度值
        self.lab_video = QtWidgets.QLabel(self.centralwidget)
        self.lab_video.setGeometry(QtCore.QRect(765, 529, 50, 30))
        self.lab_video.setObjectName("lab_video")

        self.lab_video2 = QtWidgets.QLabel(self.centralwidget2)
        self.lab_video2.setGeometry(QtCore.QRect(765, 529, 50, 30))
        self.lab_video2.setObjectName("lab_video2")        
 
        #播放按钮
        self.btn_play = QtWidgets.QPushButton(self.centralwidget)
        self.btn_play.setGeometry(QtCore.QRect(90, 570, 50, 30))
        self.btn_play.setObjectName("btn_play")

        self.btn_play2 = QtWidgets.QPushButton(self.centralwidget2)
        self.btn_play2.setGeometry(QtCore.QRect(90, 570, 50, 30))
        self.btn_play2.setObjectName("btn_play2")        
 
        #停止按钮
        self.btn_stop = QtWidgets.QPushButton(self.centralwidget)
        self.btn_stop.setGeometry(QtCore.QRect(145, 570, 50, 30))
        self.btn_stop.setObjectName("btn_stop")

        self.btn_stop2 = QtWidgets.QPushButton(self.centralwidget2)
        self.btn_stop2.setGeometry(QtCore.QRect(145, 570, 50, 30))
        self.btn_stop2.setObjectName("btn_stop2")        
 
        #MainWindow.setCentralWidget(self.centralwidget)
 
        exitAct = QAction(QIcon('exit.png'), '&Exit', self)
        exitAct.setShortcut('Ctrl+Q')
        exitAct.setStatusTip('Exit application')
        exitAct.triggered.connect(qApp.quit)
        self.statusBar()
        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(exitAct)
 
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
 
    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.btn_open.setText(_translate("MainWindow", "打开视频文件"))
        self.btn_play.setText(_translate("MainWindow", "播放"))
        self.btn_stop.setText(_translate("MainWindow", "暂停"))
        self.lab_video.setText(_translate("MainWindow", "0%"))
        self.btn_open2.setText(_translate("MainWindow", "打开视频文件"))
        self.btn_play2.setText(_translate("MainWindow", "播放"))
        self.btn_stop2.setText(_translate("MainWindow", "暂停"))
        self.lab_video2.setText(_translate("MainWindow", "0%"))

 视频错位是由于电脑显卡问题,请忽略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值