Не воспроизводится MP3-файл посредством PyQt 5 (Python 3)
Я пытаюсь воспроизводить MP3-файлы, которые лежат в списке. Для этого я передаю методу play() путь к композиции(song). Если просто передать его, возникнет ошибка:
...
self.player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl(song)))
TypeError: arguments did not match any overloaded call:
QUrl(): too many arguments
QUrl(str, mode: QUrl.ParsingMode = QUrl.TolerantMode): argument 1 has unexpected type 'bool'
QUrl(QUrl): argument 1 has unexpected type 'bool'
Путь в списке является строкой, но что-то все равно не так с типом аргумента. Если попытаться преобразовать аргумент в строку - self.player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl(str(song)))), возникнет другая ошибка:
DirectShowPlayerService::doSetUrlSource: Unresolved error code 0x80040216 (IDispatch error #22)
Пожалуйста, подскажите, как починить код?
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.player = QtMultimedia.QMediaPlayer()
self.box = QtWidgets.QGridLayout()
line = 0
for song in self.list:
play_btn = QtWidgets.QPushButton('Play', clicked = lambda song = song: self.play(song))
pause_btn = QtWidgets.QPushButton('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):
if self.player.isAudioAvailable() == False:
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(' ')
window.show()
sys.exit(app.exec_())
В коде есть еще одна проблема. Хорошо бы было вынести это в отдельный вопрос, но я даже не представляю его формулировку. Сейчас метод play определяет наличие в player звука. Если звук отсутствует, задается источник. К сожалению, по такому принципу нельзя организовать работу приложения, проигрывающего несколько композиций, т.к. звук в источнике появится после проигрывания первой песни, и код не будет обращатся к строчке, которая задает путь к композиции. Таким образом, будет проигрываться только первая песня. Можно ли как-то поправить это, сохранив возможность паузы и продолжения проигрывания?
Ответы (1 шт):
Вы правильно пишите: Путь в списке является строкой, зачем вы его берете в апострофы 'song' ?
Я отметил строки, в которые внес изменения.
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('Yes', type(song), song) # Yes
print('No ', type('song'), 'song') # No
# = if self.player.isAudioAvailable() == False:
# = self.player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl('song'))) # No ('song')
self.player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl(song))) # Yes (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_())
