Jan-28-2019, 06:24 PM
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:
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!
