Как сделать всё под QtMultimedia?

Я написал код mp3-плеера на PtQt5 использовав pygame-mixer для проигрывания музыки.
Я пробовал читать документации, примеры кода, но я просто не понимаю, что мне нужно подменить.

В общем мне нужно заменить код проигрывания с pygame-mixer на QMediaPlayer (прошу сделайте подробно и понятно).

Весь код - https://pastebin.com/BgXYYM68

Код с классом где находиться функция проигрывания - https://pastebin.com/TMpTPGeP


Ответы (1 шт):

Автор решения: S. Nick

Пожалуйста, пользуйтесь. Если что-то конкретное будет не понятно - спросите.

import sys
import os
import configparser
import random
import time

from PyQt5.Qt    import *
from PyQt5.QtMultimedia import *


class MyMusicApp(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.Play_Pause, self.Preview_Next, self.mp3_url = True, False, ''
        
    def initUI(self):
        self.SongList = []
        self.player   = QMediaPlayer()

        self.lb1 = QLabel('00:00', alignment=Qt.AlignCenter)
        self.lb2 = QLabel('00:00', alignment=Qt.AlignCenter)
        self.qsl = QSlider(Qt.Horizontal, self)  
        self.qsl.sliderMoved[int].connect(self.SetPlayPosition)
        self.btn_play = QPushButton('Воспроизведение', self, clicked=self.MusicPlay)       
        self.btn_preview = QPushButton('Предыдущая песня', self, clicked=self.MusicPreview)   
        self.btn_next = QPushButton('Следующая песня',self, clicked=self.MusicNext)
        self.btn_openmusic = QPushButton('Выберите папку с музыкой', self, clicked=self.OpenMusic)        
        self.lw = QListWidget(itemDoubleClicked=self.MouseDoubleClick) 
        
        if os.path.exists('Setting.ini'):
            config = configparser.ConfigParser()
            config.read("Setting.ini")
            PATH   = config.get('Music', 'PATH')
            self.AddListItems(PATH)
        # Создайте раскрывающийся список, чтобы изменить режим воспроизведения музыки
        self.cmb = QComboBox()  
        self.cmb.addItem('Последовательное воспроизведение')
        self.cmb.addItem('Oдин цикл')
        self.cmb.addItem('Случайная игра')

        self.timer = QTimer(self)
        self.timer.timeout.connect(self.PlayMode)
        self.timer.start(1000)

        grid = QGridLayout(self)   
        grid.addWidget(self.lw,  0, 0, 1, 0)
        grid.addWidget(self.lb1, 1, 0, 1, 1)
        grid.addWidget(self.qsl, 1, 1, 1, 1)
        grid.addWidget(self.lb2, 1, 2, 1, 1)
        grid.addWidget(self.btn_preview,  2, 0, 1, 1)
        grid.addWidget(self.btn_play,     2, 1, 1, 1)
        grid.addWidget(self.btn_next,     2, 2, 1, 1)
        grid.addWidget(self.cmb,          3, 0, 1, 3)
        grid.addWidget(self.btn_openmusic,4, 0, 1, 3)

    def SetPlayPosition(self):
        self.player.setPosition(self.qsl.value())

    def PlayMode(self):
        if self.Play_Pause==False:
            self.qsl.setMinimum(0)
            self.qsl.setMaximum(self.player.duration())
            self.qsl.setValue(self.qsl.value() + 1000)
        self.lb1.setText(time.strftime('%M:%S',time.localtime(self.player.position()/1000)))
        self.lb2.setText(time.strftime('%M:%S', time.localtime(self.player.duration() / 1000)))
        
        if self.player.position()==self.player.duration() and self.player.duration()!=0 and self.cmb.currentIndex()==0 and self.Play_Pause==False:
            if self.lw.count() == 0:
                return
            self.MusicNext()
        elif self.player.position()==self.player.duration() and self.player.duration()!=0 and self.cmb.currentIndex()==1 and self.Play_Pause==False:
            if self.lw.count() == 0:
                return
            self.Preview_Next = True
            self.mp3_url = self.SongList[self.lw.currentRow()][1]
            self.player.setMedia(QMediaContent(QUrl(self.mp3_url)))
            self.qsl.setValue(0)
            self.MusicPlay()
            self.Preview_Next = False
        elif self.player.position()==self.player.duration() and self.player.duration()!=0 and self.cmb.currentIndex()==2 and self.Play_Pause==False:
            if self.lw.count() == 0:
                return
            self.Preview_Next = True
            rand=random.randint(0, self.lw.count() - 1)
            self.lw.setCurrentRow(rand)
            self.mp3_url = self.SongList[rand][1]
            self.player.setMedia(QMediaContent(QUrl(self.mp3_url)))
            self.qsl.setValue(0)
            self.MusicPlay()
            self.Preview_Next = False

    def OpenMusic(self):
        directory = QFileDialog.getExistingDirectory(
                        self, 
                        "Выбрать папку с музыкой", 
                        os.getcwd(), 
                        QFileDialog.ShowDirsOnly
        )  
        if directory:                          
            self.AddListItems(directory)
            self.mp3_url = ''
            self.player.setMedia(QMediaContent(QUrl(self.mp3_url)))
            self.lb1.setText('00:00')
            self.lb2.setText('00:00')
            self.qsl.setSliderPosition(0)
            self.Play_Pause = True

    def AddListItems(self, directory):
        self.lw.clear()
        # Запишите музыкальный каталог в файл конфигурации 
        # для следующего удобного использования
        config = configparser.ConfigParser()
        config.read("Setting.ini")
        if not os.path.exists('Setting.ini'):
            config.add_section("Music")
        config.set("Music", "PATH", directory)
        config.write(open("Setting.ini", "w"))
        
        for songname in os.listdir(directory):
            if '.mp3' in songname:
                Song=[songname,(directory+'\\'+songname).replace('\\','/')]
                self.SongList.append(Song)
                self.lw.addItem(Song[0])
        self.lw.setCurrentRow(0)
        if not self.SongList:                 
            self.mp3_url = self.SongList[self.lw.currentRow()][1]
        
    # Дважды щелкните, чтобы воспроизвести музыку
    def MouseDoubleClick(self):
        self.qsl.setValue(0)
        self.Preview_Next = True
        self.mp3_url = self.SongList[self.lw.currentRow()][1]
        self.player.setMedia(QMediaContent(QUrl(self.mp3_url)))
        self.MusicPlay()
        self.Preview_Next = False

    def Message(self):
        QMessageBox.about(self,"Сообщение", "В настоящее время нет музыки.")

    # Воспроизведение и пауза
    def MusicPlay(self):
        if self.lw.count() == 0:
            self.Message()
            return
            
        if self.player.isAudioAvailable()==False:
            self.mp3_url = self.SongList[self.lw.currentRow()][1]
            self.player.setMedia(QMediaContent(QUrl(self.mp3_url)))
        
        if self.Play_Pause==True or self.Preview_Next==True:
            self.player.play()
            self.Play_Pause=False
            self.btn_play.setText('Пауза')
        elif self.Play_Pause==False and self.Preview_Next==False:
            self.player.pause()
            self.Play_Pause=True
            self.btn_play.setText('Воспроизведение')

    # Предыдущая песня
    def MusicPreview(self):
        self.qsl.setValue(0)
        if self.lw.count()==0:
            self.Message()
            return
            
        if self.lw.currentRow()!=0:
            self.lw.setCurrentRow(self.lw.currentRow()-1)
            self.Preview_Next = True
            self.mp3_url = self.SongList[self.lw.currentRow()][1]
            self.player.setMedia(QMediaContent(QUrl(self.mp3_url)))
            self.MusicPlay()
            self.Preview_Next = False
        else:
            self.lw.setCurrentRow(self.lw.count() - 1)
            self.Preview_Next = True
            self.mp3_url = self.SongList[self.lw.currentRow()][1]
            self.player.setMedia(QMediaContent(QUrl(self.mp3_url)))
            self.MusicPlay()
            self.Preview_Next = False

    # Следующая песня
    def MusicNext(self):
        self.qsl.setValue(0)
        if self.lw.count() == 0:
            self.Message()
            return
            
        if self.lw.currentRow() != self.lw.count()-1:
            self.lw.setCurrentRow(self.lw.currentRow()+1)
            self.Preview_Next = True
            self.mp3_url = self.SongList[self.lw.currentRow()][1]
            self.player.setMedia(QMediaContent(QUrl(self.mp3_url)))
            self.MusicPlay()
            self.Preview_Next = False
        else:
            self.lw.setCurrentRow(0)
            self.Preview_Next = True
            self.mp3_url = self.SongList[self.lw.currentRow()][1]
            self.player.setMedia(QMediaContent(QUrl(self.mp3_url)))
            self.MusicPlay()
            self.Preview_Next = False


if __name__=='__main__':
    app = QApplication(sys.argv)
    app.setStyle("fusion")
    w = MyMusicApp()
    icon = QIcon()
    icon.addPixmap(QPixmap("myicon.ico"), QIcon.Normal, QIcon.Off)
    w.setWindowIcon(icon)
    w.setWindowTitle('Музыкальный проигрыватель.')
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка