На этом шаге мы рассмотрим иерархию наследования, формат конструктора, основные методы и пример использования этого класса.
Класс QVideoWidget, определенный в модуле QtMultimediaWidgets, представляет панель вывода видео, которое воспроизводится мультимедийным проигрывателем. Задать панель вывода видео для мультимедийного проигрывателя можно вызовом метода setvideoOutput() класса QMediaPlayer.
Иерархия наследования класса QVideoWidget выглядит следующим образом:
(QObject, QPaintDevice) - (QWidget, QMediaBindableInterface) - QVideoWidget
А формат вызова его конструктора таков:
<Объект> = QVideoWidget([parent=None])
В параметре parent может быть указана ссылка на родительский компонент.
Методов класс QVideoWidget поддерживает относительно немного, и все они управляют выводом видео:
Метод является слотом;
Класс QVideoWidget поддерживает некоторое количество сигналов, генерируемых при изменении различных параметров видео (режима управления соотношением сторон, яркости, контрастности и т. д.). Описание этих сигналов приведено на странице hhttps://doc.qt.io/qt-5/qvideowidget.html.
Мы можем превратить приведенную на предыдущем шаге программу аудио проигрывателя в инструмент для воспроизведения видео (рисунок 1). Для этого достаточно внести в ее код некоторые изменения; добавленные и исправленные строки выделены комментариями.
# -*- coding: utf-8 -*- from PyQt5 import QtCore, QtWidgets, QtMultimedia # ==== Добавили ========== from PyQt5 import QtMultimediaWidgets # == Конец добавления ==== import sys class MyWindow(QtWidgets.QWidget): def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent, flags=QtCore.Qt.Window | QtCore.Qt.MSWindowsFixedSizeDialogHint) # ==== Изменили ========= self.setWindowTitle("Видеопроигрыватель") # ==Конец изменения ===== # Создаем сам проигрыватель self.mplPlayer = QtMultimedia.QMediaPlayer() self.mplPlayer.setVolume(50) self.mplPlayer.mediaStatusChanged.connect(self.initPlayer) self.mplPlayer.stateChanged.connect(self.setPlayerState) vbox = QtWidgets.QVBoxLayout() # Создаем кнопку открытия файла btnOpen = QtWidgets.QPushButton("&Открыть файл...") btnOpen.clicked.connect(self.openFile) vbox.addWidget(btnOpen) # ==== Добавили ========== vwg = QtMultimediaWidgets.QVideoWidget() vwg.setAspectRatioMode(QtCore.Qt.KeepAspectRatio) self.mplPlayer.setVideoOutput(vwg) vbox.addWidget(vwg) # == Конец добавления ==== # Создаем компоненты для управления воспроизведением. # Делаем их изначально недоступными self.sldPosition = QtWidgets.QSlider(QtCore.Qt.Horizontal) self.sldPosition.setMinimum(0) self.sldPosition.valueChanged.connect(self.mplPlayer.setPosition) self.mplPlayer.positionChanged.connect(self.sldPosition.setValue) self.sldPosition.setEnabled(False) vbox.addWidget(self.sldPosition) hbox = QtWidgets.QHBoxLayout() self.btnPlay = QtWidgets.QPushButton("&Пуск") self.btnPlay.clicked.connect(self.mplPlayer.play) self.btnPlay.setEnabled(False) hbox.addWidget(self.btnPlay) self.btnPause = QtWidgets.QPushButton("П&ауза") self.btnPause.clicked.connect(self.mplPlayer.pause) self.btnPause.setEnabled(False) hbox.addWidget(self.btnPause) self.btnStop = QtWidgets.QPushButton("&Стоп") self.btnStop.clicked.connect(self.mplPlayer.stop) self.btnStop.setEnabled(False) hbox.addWidget(self.btnStop) vbox.addLayout(hbox) # Создаем компоненты для управления громкостью hbox = QtWidgets.QHBoxLayout() lblVolume = QtWidgets.QLabel("&Громкость") hbox.addWidget(lblVolume) sldVolume = QtWidgets.QSlider(QtCore.Qt.Horizontal) sldVolume.setRange(0, 100) sldVolume.setTickPosition(QtWidgets.QSlider.TicksAbove) sldVolume.setTickInterval(10) sldVolume.setValue(50) lblVolume.setBuddy(sldVolume) sldVolume.valueChanged.connect(self.mplPlayer.setVolume) hbox.addWidget(sldVolume) btnMute = QtWidgets.QPushButton("&Тихо!") btnMute.setCheckable(True) btnMute.toggled.connect(self.mplPlayer.setMuted) hbox.addWidget(btnMute) vbox.addLayout(hbox) self.setLayout(vbox) # ==== Изменили ========= self.resize(300, 300) # ==Конец изменения ===== # Для открытия файла используем метод getOpenFileUrl() класса # QFileDialog, т. к. для создания экземпляра класса # QMediaContent нам нужен путь к файлу, заданный в виде # экземпляра класса QUrl def openFile(self): # ==== Изменили ========= file = QtWidgets.QFileDialog.getOpenFileUrl(parent=self, caption="Выберите видеофайл", filter="Видеофайлы (*.mp4 *.avi)") # ==Конец изменения ===== self.mplPlayer.setMedia(QtMultimedia.QMediaContent(file[0])) def initPlayer(self, state): if state == QtMultimedia.QMediaPlayer.LoadedMedia: # После загрузки файла подготавливаем проигрыватель # для его воспроизведения self.mplPlayer.stop() self.btnPlay.setEnabled(True) self.sldPosition.setEnabled(True) self.sldPosition.setMaximum(self.mplPlayer.duration()) elif state == QtMultimedia.QMediaPlayer.EndOfMedia: # По окончании воспроизведения файла возвращаем # проигрыватель в изначальное состояние self.mplPlayer.stop() elif state == QtMultimedia.QMediaPlayer.NoMedia or state == QtMultimedia.QMediaPlayer.InvalidMedia: # Если файл не был загружен, отключаем компоненты, # управляющие воспроизведением self.sldPosition.setValue(0) self.sldPosition.setEnabled(False) self.btnPlay.setEnabled(False) self.btnPause.setEnabled(False) self.btnStop.setEnabled(False) # В зависимости от того, воспроизводится ли файл, поставлен # ли он на паузу или остановлен, делаем соответствующие кнопки # доступными или недоступными def setPlayerState(self, state): if state == QtMultimedia.QMediaPlayer.StoppedState: self.sldPosition.setValue(0) self.btnPause.setEnabled(False) self.btnStop.setEnabled(False) elif state == QtMultimedia.QMediaPlayer.PlayingState: self.btnPause.setEnabled(True) self.btnStop.setEnabled(True) elif state == QtMultimedia.QMediaPlayer.PausedState: self.btnPause.setEnabled(False) self.btnStop.setEnabled(True) app = QtWidgets.QApplication(sys.argv) window = MyWindow() window.show() sys.exit(app.exec_())
Результат работы приложения показан на рисунке 1.
Рис.1. Простейший видеопроигрыватель
На следующем шаге мы начнем знакомиться с классом QMediaPlaylist.