Python Forum
[PyQt] Embedding a Video in Video Player
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[PyQt] Embedding a Video in Video Player
#1
Hi,

I am trying to code a video player where it plays a video file. Originally I tried to use PyQt5 however I don't have the video widget / MediaPlayer widget so coding it is for me. However, I am struggling to get a video to show and play. I don't know if it's my path? or if I am even using the right video file format? The function openFile is where the video file is supposed to be called in.

This is the code I have for the video player:

from PyQt5.QtCore import QDir, Qt, QUrl
from PyQt5.QtMultimedia import QMediaContent, QMediaPlayer
from PyQt5.QtMultimediaWidgets import QVideoWidget
from PyQt5.QtWidgets import (QApplication, QFileDialog, QHBoxLayout, QLabel,
        QPushButton, QSizePolicy, QSlider, QStyle, QVBoxLayout, QWidget)
from PyQt5.QtWidgets import QMainWindow,QWidget, QPushButton, QAction
from PyQt5.QtGui import QIcon
import sys

class VideoWindow(QMainWindow):

    def __init__(self, parent=None):
        super(VideoWindow, self).__init__(parent)

        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface) #calls the mediaPlayer

        videoWidget = QVideoWidget()  #calls the videoWidget into the window

        self.playButton = QPushButton()
        self.playButton.setEnabled(False) #default is on False, will not play video
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay)) #How the button looks
        self.playButton.clicked.connect(self.play)  #when clicked, should play

        self.positionSlider = QSlider(Qt.Horizontal) #the video slider
        self.positionSlider.setRange(0, 0) #setting the range of the slider
        self.positionSlider.sliderMoved.connect(self.setPosition)

        self.errorLabel = QLabel()
        self.errorLabel.setSizePolicy(QSizePolicy.Preferred,
                QSizePolicy.Maximum)

        # Create a widget for window contents
        wid = QWidget(self)
        self.setCentralWidget(wid)

        # Create layouts to place inside widget
        controlLayout = QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        controlLayout.addWidget(self.playButton)
        controlLayout.addWidget(self.positionSlider)

        layout = QVBoxLayout()
        layout.addWidget(videoWidget)
        layout.addLayout(controlLayout)
        layout.addWidget(self.errorLabel)

        # Set widget to contain window contents
        wid.setLayout(layout)

        self.mediaPlayer.setVideoOutput(videoWidget)
        self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
        self.mediaPlayer.positionChanged.connect(self.positionChanged)
        self.mediaPlayer.durationChanged.connect(self.durationChanged)
        self.mediaPlayer.error.connect(self.handleError)

    def openFile(self):
        homePath = open("videoplayback(1).mp4", "r")
        fileName, _ = QFileDialog.getOpenFileName(self, homePath)
        QDir.homePath()

        if fileName != " ":
            self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile(fileName)))
            self.playButton.setEnabled(True)

        else:
            self.playButton.setEnabled(True)
            #fileName.show

    def exitCall(self):
        sys.exit(app.exec_())

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

    def mediaStateChanged(self, state):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPause))
        else:
            self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))

    def positionChanged(self, position):
        self.positionSlider.setValue(position)

    def durationChanged(self, duration):
        self.positionSlider.setRange(0, duration)

    def setPosition(self, position):
        self.mediaPlayer.setPosition(position)

    def handleError(self):
        self.playButton.setEnabled(False)
        self.errorLabel.setText("Error: " + self.mediaPlayer.errorString())

if __name__ == '__main__':
    app = QApplication(sys.argv)
    player = VideoWindow()
    player.resize(640, 480)
    player.show()
    sys.exit(app.exec_())
Any suggestions would be greatly appreciated! Or if you know an easier way, I'm all ears!
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Video in Canvas finndude 6 2,912 Oct-04-2022, 02:02 PM
Last Post: finndude
  [Tkinter] Overlay Still Image on Webcam Video KDog 4 3,978 May-18-2021, 08:29 PM
Last Post: KDog
  [Tkinter] mpv window freeze before video end rfeyer 7 3,373 Feb-20-2021, 09:34 PM
Last Post: rfeyer
  [WxPython] Problems with making a Video Player in WxPython SheeppOSU 2 2,055 Sep-23-2020, 11:44 PM
Last Post: jefsummers
  Embedding Matplotlib in graphical user interfaces bobthebuilder 2 2,667 May-19-2020, 09:42 PM
Last Post: bobthebuilder
  bring the total video from playlist of youtube taratata2020 1 1,869 Mar-05-2020, 10:19 PM
Last Post: Larz60+
  [WxPython] Video in Gui vscson 13 9,496 Sep-05-2019, 05:45 PM
Last Post: Denni
  video player inside a frame/panel in python raspberry pi desktop application MATHEWS 1 2,812 Dec-12-2018, 11:42 AM
Last Post: Larz60+
  PyQt5 can't load video DecaK 6 9,978 Sep-04-2018, 01:03 PM
Last Post: Axel_Erfurt

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020