Как создать Windows GUI приложение для воспроизведения видео - PullRequest
0 голосов
/ 14 марта 2020

Это код, который я пробую ниже. Я хочу играть в .avi, .mp4, et c. Я могу выбрать видео, но не могу воспроизвести.

import sys
from PyQt5 import QtCore, QtGui, QtWidgets, QtMultimedia, QtMultimediaWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtMultimedia import QMediaContent, QMediaPlayer

from PyQt5.QtMultimediaWidgets import QVideoWidget



class Ui_MainWindow(object):
    def setupUi(self, MainWindow):

        self.mediaPlayer = QtMultimedia.QMediaPlayer(None, QtMultimedia.QMediaPlayer.VideoSurface)
        videoWidget = QtMultimediaWidgets.QVideoWidget()



        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(881, 578)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.frame = QtWidgets.QFrame(self.centralwidget)
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.frame)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.widget = QVideoWidget(self.frame)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.widget.sizePolicy().hasHeightForWidth())
        self.widget.setSizePolicy(sizePolicy)
        self.widget.setMinimumSize(QtCore.QSize(711, 471))
        self.widget.setMaximumSize(QtCore.QSize(711, 471))
        self.widget.setObjectName("widget")
        self.gridLayout_2.addWidget(self.widget, 0, 0, 3, 1)
        self.audiobar = QtWidgets.QSlider(self.frame)
        self.audiobar.setMinimumSize(QtCore.QSize(22, 160))
        self.audiobar.setMaximumSize(QtCore.QSize(22, 160))
        self.audiobar.setOrientation(QtCore.Qt.Vertical)
        self.audiobar.setObjectName("audiobar")
        self.gridLayout_2.addWidget(self.audiobar, 2, 2, 1, 1)
        self.videobar = QtWidgets.QSlider(self.frame)
        self.videobar.setMinimumSize(QtCore.QSize(711, 22))
        self.videobar.setMaximumSize(QtCore.QSize(711, 22))
        self.videobar.setOrientation(QtCore.Qt.Horizontal)
        self.videobar.setObjectName("videobar")
        self.gridLayout_2.addWidget(self.videobar, 3, 0, 1, 1)
        self.frame_2 = QtWidgets.QFrame(self.frame)
        self.frame_2.setMinimumSize(QtCore.QSize(120, 111))
        self.frame_2.setMaximumSize(QtCore.QSize(120, 111))
        self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame_2.setObjectName("frame_2")
        self.playbtn = QtWidgets.QPushButton(self.frame_2)
        self.playbtn.setGeometry(QtCore.QRect(20, 10, 75, 23))
        self.playbtn.setObjectName("playbtn")

        self.playbtn.setEnabled(False)

        self.pausebtn = QtWidgets.QPushButton(self.frame_2)
        self.pausebtn.setGeometry(QtCore.QRect(20, 40, 75, 23))
        self.pausebtn.setObjectName("pausebtn")
        self.stopbtn = QtWidgets.QPushButton(self.frame_2)
        self.stopbtn.setGeometry(QtCore.QRect(20, 70, 75, 23))
        self.stopbtn.setObjectName("stopbtn")
        self.gridLayout_2.addWidget(self.frame_2, 0, 2, 1, 1)
        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout_2.addItem(spacerItem, 0, 1, 1, 1)
        self.gridLayout.addWidget(self.frame, 1, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 881, 21))
        self.menubar.setObjectName("menubar")
        self.menuFile = QtWidgets.QMenu(self.menubar)
        self.menuFile.setObjectName("menuFile")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.actionOpen = QtWidgets.QAction(MainWindow)
        self.actionOpen.setObjectName("actionOpen")
        self.actionClose = QtWidgets.QAction(MainWindow)
        self.actionClose.setObjectName("actionClose")
        self.menuFile.addAction(self.actionOpen)
        self.menuFile.addAction(self.actionClose)
        self.menubar.addAction(self.menuFile.menuAction())

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


        self.mediaPlayer.setVideoOutput(videoWidget)

        self.actionOpen.triggered.connect(self.openFile)
        self.playbtn.clicked.connect(self.play)

        self.mediaPlayer.setVideoOutput(videoWidget)


    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MPlayer"))
        self.playbtn.setText(_translate("MainWindow", "Play"))
        self.pausebtn.setText(_translate("MainWindow", "Pause"))
        self.stopbtn.setText(_translate("MainWindow", "Stop"))
        self.menuFile.setTitle(_translate("MainWindow", "File"))
        self.actionOpen.setText(_translate("MainWindow", "Open"))
        self.actionClose.setText(_translate("MainWindow", "Close"))

    def openFile(self):
        fileName, _ = QFileDialog.getOpenFileName(None, "Select Video", " ", "Video Files (*.mp4 *.avi)",
                                                  QtCore.QDir.homePath())

        if fileName != '':
            self.mediaPlayer.setMedia(
                   QtMultimedia.QMediaContent(QtCore.QUrl.fromLocalFile(fileName)))
            self.playbtn.setEnabled(True)
            self.statusbar.showMessage(fileName)
            self.play()

    def play(self):
        if self.mediaPlayer.state() == QtMultimedia.QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
        else:
            self.mediaPlayer.play()


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

1 Ответ

1 голос
/ 14 марта 2020

Вы установили вывод видео на videoWidget, но не добавили его в интерфейс.

Вы уже создали видео-виджет, и это self.widget, так что у вас просто есть чтобы использовать это (и только один раз):

    self.mediaPlayer.setVideoOutput(self.widget)

Обратите внимание, что вы используете вывод pyui c для своей программы, который крайне не рекомендуется. Следуйте инструкциям о , используя вместо этого Designer .

...