Как можно реализовать продолжение проигрывания MP3-файла после паузы?(Python 3, PyQt 5)
Сейчас для каждой композиции в списке self.list создается две кнопки - pause_btn и play_btn. С первой кнопкой все понятно, она просто ставит воспроизведение на паузу, а вот вторая вызывает вопросы.
Кнопка play_btn взаимодействует с методом play, который в качестве аргумента принимает путь к композиции и задает источник звука. Если поставить аудио на паузу, а потом нажать кнопку play_btn, источник будет задан снова, и композиция начнет проигрывание с самого начала, а не с месиа паузы. Когда в self.list был всего один путь к файлу, проблема решалась достаточно просто:
def play(self, song):
if self.player.isAudioAvailable() == False:
self.player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl(song)))
self.player.play()
Тут выполняется проверка на наличие звука в проигрывателе, если его нет, задается источник. Когда появится необходимость проигрывания нескольких композиций, возникнет проблема - при нажатии на кнопку, которая относится к другому аудиофайлу, проверка на наличие звука вернет True, из-за чего программа проигнорирует строку, которая задает источник. Т.е. последующие нажатия на кнопки pause_btn и play_btn будут менять состояние проигрывания только одного файла.
Тогда я подумал, что можно сравнить текущий файл в проигрывателе с тем, что принимает метод play. Я нашел метод media(), который возвращает заданный источник. Но попытка вывести этот источник в консоль приводит к следующему: <PyQt5.QtMultimedia.QMediaContent object at 0x000001C8CAC43978>, т.е. метод возвращает экземпляр класса QMediaContent. Как я понял, его нельзя будет сравнить со строкой, которую принимает метод play. Да и вообще, этот способ показался мне нерациональным.
Пожалуйста, подскажите, как можно реализовать возможность поставить композицию на паузу, а потом продолжить проигрывание снова, при наличии нескольких аудифайлов?
from PyQt5 import QtCore, QtWidgets, QtGui, QtMultimedia
class MyWindow(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.list = ['1.Papercut.mp3', '13.Numb.mp3']
#self.list = ['bibi.mp3', 'D:/_Qt/EXE/Mp3/new_build/QThread_mp3/img/zvuki_prirody.mp3']
self.player = QtMultimedia.QMediaPlayer()
self.box = QtWidgets.QGridLayout()
line = 0
for song in self.list:
play_btn = QtWidgets.QPushButton('Play', clicked=lambda ch, song=song: self.play(song))
pause_btn = QtWidgets.QPushButton('Pause', clicked=self.pause)
label = QtWidgets.QLabel(song)
self.box.addWidget(play_btn, line, 0)
self.box.addWidget(pause_btn, line, 1)
self.box.addWidget(label, line, 2)
line = line + 1
self.setLayout(self.box)
# Воспроизведение
def play(self, song):
print(str(self.player.media()))
self.player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl(song)))
self.player.play()
# Пауза
def pause(self):
self.player.pause()
# Повтор
def replay(self):
pass
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.setWindowTitle('MP3-player, PyQt5')
window.show()
sys.exit(app.exec_())
Ответы (1 шт):
Обратите внимание я поменял тип данных self.list - теперь это словарь
и отметил строки, которые изменил.
from PyQt5 import QtCore, QtWidgets, QtGui, QtMultimedia
class MyWindow(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
# self.list = ['1.Papercut.mp3', '13.Numb.mp3']
# self.list = ['bibi.mp3', 'D:/_Qt/EXE/Mp3/new_build/QThread_mp3/img/zvuki_prirody.mp3']
self.list = {
'bibi.mp3': [],
'D:/_Qt/EXE/Mp3/new_build/QThread_mp3/img/zvuki_prirody.mp3': []
}
self.song = '' # +++
self.player = QtMultimedia.QMediaPlayer()
self.box = QtWidgets.QGridLayout(self)
for line, song in enumerate(self.list): # enumerate
# print(line, song)
play_btn = QtWidgets.QPushButton('Play', clicked=lambda ch, song=song: self.play(song))
pause_btn = QtWidgets.QPushButton('Pause', clicked=self.pause, enabled=False) # enabled
label = QtWidgets.QLabel(song)
self.box.addWidget(play_btn, line, 0)
self.box.addWidget(pause_btn, line, 1)
self.box.addWidget(label, line, 2)
self.list[song].append(play_btn) # +++
self.list[song].append(pause_btn) # +++
# Воспроизведение
def play(self, song):
if self.player.isAudioAvailable() == False:
self.player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl(song)))
self.list[song][1].setEnabled(True) # +++
self.song = song # +++
# ++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
if self.song == song:
pass
else:
self.player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl(song)))
self.list[self.song][1].setEnabled(False)
self.list[song][1].setEnabled(True)
self.song = song
# ++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
self.player.play()
# Пауза
def pause(self):
self.player.pause()
# Повтор
def replay(self):
pass
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.setWindowTitle('MP3-player, PyQt5')
window.show()
sys.exit(app.exec_())
