ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 05.12.2023
Просмотров: 887
Скачиваний: 3
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
676
Часть II. Библиотека PyQt 5
position()
— возвращает текущую позицию воспроизведения мультимедиа в миллисе- кундах;
isSeekable()
— возвращает
True
, если имеется возможность изменить позицию воспро- изведения, и
False
, если источник этого не поддерживает;
setPosition(<Позиция воспроизведения>)
— задает текущую позицию воспроизведения в миллисекундах. Метод является слотом;
setVolume(<Громкость>)
— задает громкость звука в виде числа от
0
(звук отключен) до
100
(максимальная громкость). Метод является слотом;
volume()
— возвращает громкость звука в виде числа от
0
до
100
;
setMuted(<Флаг>)
— если передать значение
True
, звук будет отключен. Значение
False восстанавливает прежнюю громкость. Метод является слотом;
isMuted()
— возвращает
True
, если звук в настоящее время отключен, и
False
— в про- тивном случае;
setPlaybackRate(<Скорость воспроизведения>)
— задает скорость воспроизведения мультимедиа. Значение параметра должно представлять собой вещественное число, ум- ножаемое на стандартную скорость воспроизведения, чтобы получить ее новую величи- ну. Значение
1.0
задает стандартную скорость, меньшее
1.0
— уменьшенную скорость, а большее
1.0
— увеличенную. Метод является слотом;
playbackRate()
— возвращает текущую скорость воспроизведения мультимедиа;
setVideoOutput(
— задает панель для вывода видео, представляемую экземпляром класса
QVideoWidget
. Используется лишь при воспроизведении видео;
mediaStatus()
— возвращает состояние источника в виде значения одного из следую- щих атрибутов класса
QMediaPlayer
:
•
UnknownMediaStatus
—
0
— состояние определить не удается;
•
NoMedia
—
1
— указанный источник отсутствует;
•
LoadingMedia
—
2
— идет загрузка данных источника;
•
LoadedMedia
—
3
— загрузка данных источника закончена;
•
StalledMedia
—
4
— воспроизведение приостановлено из-за опустошения внутренне- го буфера проигрывателя или невозможности загрузить следующую порцию данных;
•
BufferingMedia
—
5
— идет заполнение данными внутреннего буфера проигрывате- ля, однако данных достаточно для продолжения воспроизведения;
•
BufferedMedia
—
6
— внутренний буфер заполнен, идет воспроизведение;
•
EndOfMedia
—
7
— воспроизведение источника закончено;
•
InvalidMedia
—
8
— источник не может быть воспроизведен (неподдерживаемый формат мультимедийных данных, поврежденный файл и т. п.);
isAudioAvailable()
— возвращает
True
, если источник содержит звук, и
False
— в про- тивном случае. Обычно используется при воспроизведении видеороликов, чтобы узнать, имеют ли они звуковое сопровождение;
isVideoAvailable()
— возвращает
True
, если источник содержит видео, и
False
— в противном случае;
bufferStatus()
— возвращает процент заполнения внутреннего буфера проигрывателя в виде числа от
0
до
100
;
Глава 28. Мультимедиа
677
error()
— возвращает ошибку, возникшую при воспроизведении мультимедиа, в виде значения одного из следующих атрибутов класса
QMediaPlayer
:
•
NoError
—
0
— никакой ошибки не возникло;
•
ResourceError
—
1
— не удалось загрузить источник;
•
FormatError
—
2
— неподдерживаемый формат звука или видео;
•
NetworkError
—
3
— сетевая ошибка;
•
AccessDeniedError
—
4
— недостаточно прав для загрузки источника;
•
ServiceMissingError
—
5
— ошибка в мультимедийной подсистеме;
errorString()
— возвращает текстовое описание ошибки;
isMetaDataAvailable()
— возвращает
True
, если доступны метаданные источника, опи- сывающие хранящиеся в нем мультимедийные данные, и
False
— в противном случае;
metaData(<Ключ>)
— возвращает метаданные, относящиеся к заданному в виде строки ключу. Список доступных ключей, которые могут нам пригодиться, приведен далее
(полный их список можно найти на странице https://doc.qt.io/qt-5/qmediametadata.html).
Если не указано обратное, все значения представляют собой строки, а слово «список» означает обычный список Python (класс list
).
•
Title
— название произведения;
•
Author
— список авторов произведения;
•
Comment
— примечание;
•
Description
— описание;
•
Genre
— список жанров, к которым относится произведение;
•
Year
— год выпуска произведения в виде целого числа;
•
Date
— дата выпуска произведения в виде экземпляра класса datetime.date
;
•
Language
— язык произведения;
•
Copyright
— авторские права создателей произведения;
•
Size
— размер мультимедийного файла в байтах, представленный целым числом;
•
Duration
— продолжительность воспроизведения мультимедийного файла в милли- секундах, заданная целым числом;
•
AudioBitRate
— битрейт звука в виде целого числа, измеряемый в битах в секунду;
•
AudioCodec
— кодек, с помощью которого кодировался звук;
•
ChannelCount
— количество каналов звука в виде целого числа;
•
AlbumTitle
— название альбома, в который входит произведение;
•
AlbumArtist
— автор альбома;
•
ContributingArtist
— список исполнителей, занятых в записи альбома;
•
Composer
— список композиторов, произведения которых входят в альбом;
•
Conductor
— дирижер, занятый в записи альбома;
•
Lyrics
— тексты песен, входящих в альбом;
•
TrackNumber
— порядковый номер произведения в альбоме в виде целого числа;
678
Часть II. Библиотека PyQt 5
•
TrackCount
— количество произведений в альбоме в виде целого числа;
•
Resolution
— размер видео в виде экземпляра класса
QSize
;
•
VideoFrameRate
— частота кадров видео в виде вещественного числа, измеряемая в кадрах в секунду;
•
VideoBitRate
— битрейт видео в виде целого числа, измеряемый в битах в секунду;
•
VideoCodec
— кодек, с помощью которого кодировалось видео;
•
Director
— режиссер фильма;
•
LeadPerformer
— список актеров, занятых в фильме;
•
Writer
— список авторов сценария фильма.
Следует отметить, что в источнике совсем не обязательно будут присутствовать все эти данные;
availableMetaData()
— возвращает список ключей, доступных в источнике метаданных.
Класс
QMediaPlayer поддерживает большое количество сигналов, из которых для нас пред- ставляют интерес лишь приведенные далее (полный их список можно найти на странице https://doc.qt.io/qt-5/qmediaplayer.html
).
mediaChanged(
— генерируется при указании другого источника. Но- вый источник передается в параметре;
currentMediaChanged(
— генерируется при указании другого источни- ка или переходе на новую позицию плейлиста. Новый источник передается в параметре;
durationChanged(<Продолжительность>)
— генерируется при первом получении или из- менении продолжительности ролика. Новое значение продолжительности, заданное целым числом в миллисекундах, передается обработчику в параметре;
stateChanged(<Состояние>)
— генерируется при изменении состояния проигрывателя.
В параметре обработчику передается новое состояние в виде целочисленного обозна- чения;
positionChanged(<Позиция>)
— генерируется при изменении позиции воспроизведения.
В параметре обработчику передается новая позиция в виде целого числа в миллисе- кундах.
По умолчанию такой сигнал генерируется каждые 1000 миллисекунд (1 секунду). Мы можем изменить этот интервал времени, указав нужное значение в вызове метода setNotifyInterval(<Интервал>)
класса
QMediaPlayer
;
volumeChanged(<Громкость>)
— генерируется при изменении громкости. В параметре передается новое значение громкости в виде целого числа;
mutedChanged(<Флаг>)
— генерируется при отключении или, напротив, включении звука.
В параметре передается значение
True
, если звук отключен, или
False
, если вновь вклю- чен;
playbackRateChanged(<Скорость воспроизведения>)
— генерируется при изменении ско- рости воспроизведения. В параметре передается новое значение скорости воспроизведе- ния, представленное вещественным числом;
mediaStatusChanged(<Состояние источника>)
— генерируется при изменении состояния источника. Новое целочисленное обозначение состояния передается в параметре;
Глава 28. Мультимедиа
679
bufferStatusChanged(<Состояние буфера>)
— генерируется при изменении процента заполнения внутреннего буфера проигрывателя. Новая величина процента заполнения в виде целого числа передается в параметре;
error(<Ошибка>)
— генерируется при возникновении ошибки. Целочисленное обозначе- ние ошибки передается в параметре;
metaDataAvailableChanged(<Флаг>)
— генерируется при получении метаданных, запи- санных в ролике. В параметре передается
True
, если метаданные доступны, или
False
— в противном случае;
metaDataChanged()
— генерируется при изменении метаданных ролика;
metaDataChanged(<Ключ>, <Значение>)
— генерируется при изменении какого-либо зна- чения метаданных ролика. В параметрах передаются строковый ключ изменившегося значения и само это значение.
Простейший аудиопроигрыватель (листинг 28.1) предоставляет кнопку для открытия звуко- вого файла, кнопки пуска, паузы и остановки воспроизведения, регулятор текущей позиции воспроизведения, регулятор громкости и кнопку временного отключения звука (рис. 28.1).
Рис. 28.1. Интерфейс простейшего аудиопроигрывателя
Листинг 28.1. Простейший аудиопроигрыватель from PyQt5 import QtCore, QtWidgets, QtMultimedia 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)
680
Часть II. Библиотека PyQt 5
# Создаем компоненты для управления воспроизведением.
# Делаем их изначально недоступными 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, 100)
# Для открытия файла используем метод getOpenFileUrl() класса
# QFileDialog, т. к. для создания экземпляра класса
# QMediaContent нам нужен путь к файлу, заданный в виде
# экземпляра класса QUrl def openFile(self): file = QtWidgets.QFileDialog.getOpenFileUrl(parent=self, caption = "Выберите звуковой файл", filter = "Звуковые файлы (*.mp3 *.ac3)") self.mplPlayer.setMedia(QtMultimedia.QMediaContent(file[0]))
Глава 28. Мультимедиа
681 def initPlayer(self, state): if state == QtMultimedia.QMediaPlayer.LoadedMedia:
# После загрузки файла подготавливаем проигрыватель
# для его воспроизведения self.mplPlayer.stop() self.btnPlay.setEnabled(True) self.btnPause.setEnabled(False) self.sldPosition.setEnabled(True) self.sldPosition.setMaximum(self.mplPlayer.duration()) elif state == QtMultimedia.QMediaPlayer.EndOfMedia:
# По окончании воспроизведения файла возвращаем
# проигрыватель в изначальное состояние self.mplPlayer.stop() self.sldPosition.setValue(0) self.sldPosition.setEnabled(False) self.btnPlay.setEnabled(False) self.btnPause.setEnabled(False) self.btnStop.setEnabled(False) 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.btnPlay.setEnabled(True) self.btnPause.setEnabled(False) self.btnStop.setEnabled(False) elif state == QtMultimedia.QMediaPlayer.PlayingState: self.btnPlay.setEnabled(False) self.btnPause.setEnabled(True) self.btnStop.setEnabled(True) elif state == QtMultimedia.QMediaPlayer.PausedState: self.btnPlay.setEnabled(True) self.btnPause.setEnabled(False) self.btnStop.setEnabled(True) app = QtWidgets.QApplication(sys.argv) window = MyWindow() window.show() sys.exit(app.exec_())
682
Часть II. Библиотека PyQt 5
В листинге 28.2 приведен код служебной утилиты, выводящей метаданные, которые хра- нятся в загруженном мультимедийном файле. В настоящий момент она выводит сведения об открытом в ней аудиофайле (рис. 28.2).
Рис. 28.2. Интерфейс утилиты, выводящей метаданные мультимедийного файла
Листинг 28.2. Вывод метаданных мультимедийного файла from PyQt5 import QtCore, QtWidgets, QtMultimedia 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.showMetadata) vbox = QtWidgets.QVBoxLayout() btnOpen = QtWidgets.QPushButton("&Открыть файл...") btnOpen.clicked.connect(self.openFile) vbox.addWidget(btnOpen)
# Создаем доступное только для чтения многострочное текстовое
# поле, в которое будет выводиться результат self.txtOutput = QtWidgets.QTextEdit() self.txtOutput.setReadOnly(True) vbox.addWidget(self.txtOutput) self.setLayout(vbox) self.resize(300, 250) def openFile(self): file = QtWidgets.QFileDialog.getOpenFileUrl(parent=self, caption = "Выберите звуковой файл",
Глава 28. Мультимедиа
683 filter = "Звуковые файлы (*.mp3 *.ac3)") self.mplPlayer.setMedia(QtMultimedia.QMediaContent(file[0])) def showMetadata(self, state): self.txtOutput.clear()
# Как только файл будет загружен... if state == QtMultimedia.QMediaPlayer.LoadedMedia:
# ...извлекаем ключи всех доступных метаданных... keys = self.mplPlayer.availableMetaData() s = ""
# ...перебираем их в цикле... for k in keys: v = self.mplPlayer.metaData(k)
# ...на случай пустых списков проверяем, действительно
# ли по этому ключу хранится какое-то значение... if v:
# ...если значение представляет собой список,
# преобразуем его в строку... if v is list: v = ", ".join(v)
# ...формируем на основе значений текст... s += "
1 ... 60 61 62 63 64 65 66 67 ... 83
" + k + ": " + str(v) + "
"
# ...и выводим его в текстовое поле self.txtOutput.setHtml(s) app = QtWidgets.QApplication(sys.argv) window = MyWindow() window.show() sys.exit(app.exec_())
28.2. Класс QVideoWidget
Класс
QVideoWidget
, определенный в модуле
QtMultimediaWidgets
, представляет панель вы- вода видео, которое воспроизводится мультимедийным проигрывателем. Задать панель вы- вода видео для мультимедийного проигрывателя можно вызовом метода setVideoOutput()
класса
QMediaPlayer
Иерархия наследования класса
QVideoWidget выглядит следующим образом:
(QObject, QPaintDevice) — (QWidget, QMediaBindableInterface) —
QVideoWidget
А формат вызова его конструктора таков:
<Объект> = QVideoWidget([parent=None])
В параметре parent может быть указана ссылка на родительский компонент.
Методов класс
QVideoWidget поддерживает относительно немного, и все они управляют выводом видео:
setFullScreen(<Флаг>)
— если передать значение
True
, воспроизводящееся видео займет весь экран. Если передать значение
False
, оно займет лишь саму панель. Метод является слотом;
684
Часть II. Библиотека PyQt 5
isFullScreen()
— возвращает
True
, если воспроизводящееся видео занимает весь экран, и
False
, если оно выводится лишь в самой панели;
setAspectRatioMode(<Соотношение сторон>)
— задает режим управления соотношением сторон при масштабировании видео. В качестве результата указывается один из сле- дующих атрибутов класса
QtCore.Qt
:
•
IgnoreAspectRatio
—
0
— соотношение сторон при масштабировании видео не со- блюдается, в результате чего видео может выводиться сжатым или вытянутым;
•
KeepAspectRatio
—
1
— соотношение сторон соблюдается. Видео масштабируется так, чтобы полностью вместиться в панель или экран, но при этом какая-то часть панели или экрана может оказаться незанятой;
•
KeepAspectRatioByExpanding
—
2
— соотношение сторон соблюдается. Видео мас- штабируется так, чтобы полностью занять панель (экран), но при этом какая-то часть видео может выйти за ее границы.
Метод является слотом;
aspectRatioMode()
— возвращает обозначение режима управления соотношением сто- рон при масштабировании видео;
setBrightness(<Яркость>)
— задает яркость видео в виде числа от
-100
до
100
: отрица- тельные значения делают видео более темным, положительные — более светлым, а
0
устанавливает яркость по умолчанию. Метод является слотом;
brightness()
— возвращает яркость видео;
setContrast(<Контрастность>)
— задает контрастность видео в виде числа от
-100
до
100
: отрицательные значения делают видео менее контрастным, положительные — более контрастным, а
0
устанавливает значение этого параметра по умолчанию. Метод является слотом;
contrast()
— возвращает контрастность видео;
setHue(<Оттенок>)
— задает оттенок видео в виде числа от
-100
до
100
: значения, отлич- ные от
0
, изменяют цветность видео, а
0
устанавливает значение этого параметра по умолчанию. Метод является слотом;
hue()
— возвращает значение оттенка видео;
setSaturation(<Насыщенность>)
— задает насыщенность видео в виде числа от
-100
до
100
: отрицательные значения делают видео менее насыщенным, положительные — более насыщенным, а
0
устанавливает значение этого параметра по умолчанию. Метод является слотом;
saturation()
— возвращает насыщенность видео;
mediaObject()
— возвращает ссылку (экземпляр класса
QMediaObject
) на мультимедий- ный проигрыватель, выводящий видео в эту панель, или
None
, если панель не привязана к проигрывателю.
Класс
QVideoWidget поддерживает некоторое количество сигналов, генерируемых при изме- нении различных параметров видео (режима управления соотношением сторон, яркости, контрастности и т. д.). Описание этих сигналов приведено на странице https://doc.qt.io/qt-5/ qvideowidget.html
Мы можем превратить написанную ранее программу аудиопроигрывателя в инструмент для воспроизведения видео (рис. 28.3). Для этого достаточно внести в ее код некоторые измене-