'PyQt5 Media Player Corrupts video
I tried making a PyQt5 custom media player that opens plays one specific video and print the coordinates of the mouse when left clicking.
class Window(QWidget): def init(self): super().init()
user32 = ctypes.windll.user32
user32.SetProcessDPIAware()
self.setWindowTitle("Media Player")
self.setGeometry(350, 100, 700, 500)
self.setWindowIcon(QIcon('eye_icon.png'))
p = self.palette()
p.setColor(QPalette.Window, Qt.black)
self.setPalette(p)
self.init_ui()
def init_ui(self):
# Create a Media Player Object
self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)
self.mediaPlayer.mediaStatusChanged.connect(self.statusChanged)
# Create a Video Widget Object
self.videowidget = QVideoWidget()
# Create Play Button
self.playBtn = QPushButton()
self.playBtn.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
self.playBtn.clicked.connect(self.play_video)
# Create Hbox Layout
hboxLayout = QHBoxLayout()
hboxLayout.setContentsMargins(0, 0, 0, 0)
# Set Widgets to the Hbox layout
hboxLayout.addWidget(self.playBtn)
# Create Vbox Layout
vboxLayout = QVBoxLayout()
vboxLayout.addWidget(self.videowidget)
vboxLayout.addLayout(hboxLayout)
self.setLayout(vboxLayout)
self.mediaPlayer.setVideoOutput(self.videowidget)
# Media Player Signals
self.mediaPlayer.stateChanged.connect(self.mediastate_changed)
self.hidden = True
def mousePressEvent(self, event):
if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
if event.button() == Qt.LeftButton:
x, y = pyautogui.position()
a = (x, y)
print(a)
def statusChanged(self, status):
if status == QMediaPlayer.EndOfMedia:
if self.filename.endswith('.mp4') or self.filename.endswith('.flv') or self.filename.endswith('.mov') \
or self.filename.endswith('.wmv') or self.filename.endswith('.avi') or self.filename.endswith(
'.mkv'):
print("End of video")
else:
self.playBtn.setEnabled(False)
def hide_unhide(self):
if self.hidden:
self.playBtn.show()
self.hidden = False
else:
self.playBtn.hide()
self.hidden = True
def play_video(self):
if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
self.mediaPlayer.pause()
else:
self.filename = 'Black_Video_3.mp4'
global filepath
filepath = self.filename
self.playBtn.hide()
if self.filename != '':
self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile(self.filename)))
self.mediaPlayer.play()
self.playBtn.setEnabled(False)
def mediastate_changed(self, state):
if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
self.playBtn.setIcon(
self.style().standardIcon(QStyle.SP_MediaPause)
)
else:
self.playBtn.setIcon(
self.style().standardIcon(QStyle.SP_MediaPlay)
)
def set_position(self, position):
self.mediaPlayer.setPosition(position)
def handle_errors(self):
self.playBtn.setEnabled(False)
self.label.setText("Error:" + self.mediaPlayer.errorString())
def statusChanged(self, status):
if status == QMediaPlayer.EndOfMedia:
if self.filename.endswith('.mp4') or self.filename.endswith('.flv') or self.filename.endswith('.mov') \
or self.filename.endswith('.wmv') or self.filename.endswith('.avi') or self.filename.endswith(
'.mkv'):
print("Bye")
sys.exit()
else:
self.playBtn.setEnabled(False)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.showMaximized()
app.exec_()
Problem is that the video on the left down side of the screen looks like the frame is broken kind of like a puzzle. Like the image is moving a little up and down at that side of the screen and it is really annoying. This happens especially in Full Screen. Any ideas what I am doing wrong?
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
