I was trying to create a simple video player using PyQt6. I found this example on the internet:
import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QPushButton, QSlider
from PyQt6.QtMultimedia import QMediaPlayer, QMediaContent
from PyQt6.QtMultimediaWidgets import QVideoWidget
from PyQt6.QtCore import QUrl, Qt
class VideoPlayer(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Video Player")
self.setGeometry(100, 100, 1024, 768)
self.media_player = QMediaPlayer(None, QMediaPlayer.VideoSurface)
self.video_widget = QVideoWidget()
self.start_button = QPushButton("Start")
self.start_button.clicked.connect(self.start_video)
self.pause_button = QPushButton("Pause")
self.pause_button.clicked.connect(self.pause_video)
self.stop_button = QPushButton("Stop")
self.stop_button.clicked.connect(self.stop_video)
self.slider = QSlider(Qt.Orientation.Horizontal)
self.slider.sliderMoved.connect(self.set_position)
self.media_player.setVideoOutput(self.video_widget)
self.media_player.setMedia(QMediaContent(QUrl.fromLocalFile("Video.mp4")))
self.media_player.positionChanged.connect(self.position_changed)
self.media_player.durationChanged.connect(self.duration_changed)
layout = QVBoxLayout()
layout.addWidget(self.video_widget)
layout.addWidget(self.start_button)
layout.addWidget(self.pause_button)
layout.addWidget(self.stop_button)
layout.addWidget(self.slider)
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
def start_video(self):
self.media_player.play()
def pause_video(self):
self.media_player.pause()
def stop_video(self):
self.media_player.stop()
def set_position(self, position):
self.media_player.setPosition(position)
def position_changed(self, position):
self.slider.setValue(position)
def duration_changed(self, duration):
self.slider.setRange(0, duration)
if __name__ == "__main__":
app = QApplication(sys.argv)
video_player = VideoPlayer()
video_player.show()
sys.exit(app.exec())
But it doesn't work. As far as I understand, the "QMediaContent" and "QMediaPlayer.VideoSurface" classes are no longer supported. How can I change this code to make the player work?
I've been trying to find what these classes were replaced with, but there's very little information on the internet about playing video in PyQt6 at the moment.
PyQt5:
QMediaPlayer(parent=None, flags=QMediaPlayer.Flags())
QMediaPlayer.media # property of type QMediaContent
QMediaPlayer.setMedia(media, stream=None)
PyQt6: The QMediaPlayer.Flags enum was removed, the QMediaContent class was removed, and the media
property was replaced with source
.
QMediaPlayer(parent=None)
QMediaPlayer.source # property of type QUrl
QMediaPlayer.setSource(source)
The example can be fixed by changing those two lines accordingly.
class VideoPlayer(QMainWindow):
def __init__(self):
super().__init__()
...
self.media_player = QMediaPlayer()
self.media_player.setSource(QUrl.fromLocalFile("Video.mp4"))
self.video_widget = QVideoWidget()
self.media_player.setVideoOutput(self.video_widget)
...
See Changes to Qt Multimedia for the complete list of changes.