使用QMediaPlayer播放音乐文件

链接:https://pan.baidu.com/s/1WWOXlPqNxq6zdEEoCr611g 
提取码:qw7h

myMainWindow.py

import sys
from PyQt5.QtWidgets import QApplication,QMainWindow,QFileDialog,QListWidgetItem
from PyQt5.QtCore import pyqtSlot,QUrl,QModelIndex,QDir,QFileInfo
from PyQt5.QtGui import QIcon
from PyQt5.QtMultimedia import QMediaPlayer,QMediaPlaylist,QMediaContent

from ui_mainwindow import Ui_MainWindow
class QmyMainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui=Ui_MainWindow()
        self.ui.setupUi(self)

        self.player=QMediaPlayer(self)#播放器
        self.playlist=QMediaPlaylist(self)#播放列表
        self.player.setPlaylist(self.playlist)#为播放器设置播放列表
        self.playlist.setPlaybackMode(QMediaPlaylist.Loop)#循环模式

        self.__duration=""#文件总时间长度
        self.__curPos=""#当前播放位置

        self.player.stateChanged.connect(self.do_stateChanged)
        self.player.positionChanged.connect(self.do_positionChanged)
        self.player.durationChanged.connect(self.do_durationChanged)
        self.playlist.currentIndexChanged.connect(self.do_currentChanged)

    def do_stateChanged(self,state):##播放器状态变化
        self.ui.btnPlay.setEnabled(state!=QMediaPlayer.PlayingState)
        self.ui.btnPause.setEnabled(state==QMediaPlayer.PlayingState)
        self.ui.btnStop.setEnabled(state==QMediaPlayer.PlayingState)

    def do_positionChanged(self,position):##当前文件播放位置变化
        if(self.ui.sliderPosition.isSliderDown()):#正在拖动滑块调整进度
            return 
        self.ui.sliderPosition.setSliderPosition(position)
        secs=position/1000  #秒
        mins=secs/60#分
        secs=secs%60 #秒
        self.__curPos="%d:%d"%(mins,secs)
        self.ui.LabRatio.setText(self.__curPos+'/'+self.__duration)

    def do_durationChanged(self,duration):##文件时长变化
        self.ui.sliderPosition.setMaximum(duration)
        secs=duration/1000
        mins=secs/60 #分
        secs=secs%60 #余数 是 秒
        self.__duration="%d:%d"%(mins,secs)
        self.ui.LabRatio.setText(self.__curPos+'/'+self.__duration)

    def do_currentChanged(self,position):#playlist当前曲目发生变化时
        self.ui.listWidget.setCurrentRow(position)
        item=self.ui.listWidget.currentItem()##QListWidgetItem
        if(item!=None):
            self.ui.LabCurMedia.setText(item.text())
    @pyqtSlot()##添加文件
    def on_btnAdd_clicked(self):
        curPath=QDir.currentPath()
        dlgTitle="选择音频文件"
        filt="音频文件(*.mp3 *.wav *.wma);所有文件(*.*)"
        fileList,flt=QFileDialog.getOpenFileNames(self,dlgTitle,curPath,filt)
        count=len(fileList)
        if(count<1):
            return
        filename=fileList[0]
        fileInfo=QFileInfo(filename)#文件信息
        QDir.setCurrent(fileInfo.absolutePath())#重设当前路径
        for i in range(count):
            filename=fileList[i]
            fileInfo.setFile(filename)
            song=QMediaContent(QUrl.fromLocalFile(filename))
            self.playlist.addMedia(song)#添加播放媒体
            basename=fileInfo.baseName()
            self.ui.listWidget.addItem(basename)
        if(self.player.state()!=QMediaPlayer.PlayingState):
            self.playlist.setCurrentIndex(0)
            self.player.play()
    @pyqtSlot()##移除一个文件
    def on_btnRemove_clicked(self):
        pos=self.ui.listWidget.currentRow()
        item=self.ui.listWidget.takeItem(pos)##python会自动删除
        if(self.playlist.currentIndex()==pos):##是当前播放的曲目
            nextPos=0
            if pos>=1:
                nextPos=pos-1
                self.playlist.removeMedia(pos)#从播放列表里删除
            if(self.ui.listWidget.count()>0):
                self.playlist.setCurrentIndex(nextPos)
                self.do_currentChanged(nextPos)
            else:
                self.player.stop()
                self.ui.LabCurMedia.setText("无曲目")
        else:#不是当前播放的曲目,直接删除
            self.playlist.removeMedia(pos)
    @pyqtSlot()#清空播放列表
    def on_btnClear_clicked(self):
        self.playlist.clear()#清空播放列表
        self.ui.listWidget.clear()
        self.player.stop()#停止播放

    @pyqtSlot()#上一曲目
    def on_btnPrevious_clicked(self):
        self.playlist.previous()
    @pyqtSlot()##下一曲目
    def on_btnNext_clicked(self):
        self.playlist.next()
    def on_listWidget_doubleClicked(self,index):##双击时切换播放文件
        rowNo=index.row()#行号
        self.playlist.setCurrentIndex(rowNo)
        self.player.play()
    
    @pyqtSlot()#播放
    def on_btnPlay_clicked(self):
        if(self.playlist.currentIndex()<0):
            self.playlist.setCurrentIndex(0)
        self.player.play()
    @pyqtSlot()##暂停
    def on_btnPause_clicked(self):
        self.player.pause()
    @pyqtSlot()##停止
    def on_btnStop_clicked(self):
        self.player.stop()
    
    @pyqtSlot()#静音控制
    def on_btnSound_clicked(self):
        mute=self.player.isMuted()
        self.player.setMuted(not mute)
        if mute:
            self.ui.btnSound.setIcon(QIcon(":/icons/images/volumn.bmp"))
        else:
            self.ui.btnSound.setIcon(QIcon(":/icons/images/mute.bmp"))
    @pyqtSlot(int)#调节音量
    def on_sliderVolumn_valueChanged(self,value):
        self.player.setVolume(value)
    @pyqtSlot(int)#文件进度调度
    def on_sliderPosition_valueChanged(self,value):
        self.player.setPosition(value)
    def closeEvent(self, event):#窗体关闭时
        if(self.player.state()==QMediaPlayer.PlayingState):
            self.player.stop()
if __name__=="__main__":
    # QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)#自适应缩放
    app=QApplication(sys.argv)
    form=QmyMainWindow()
    form.show()
    sys.exit(app.exec_()) 

猜你喜欢

转载自blog.csdn.net/salmonwilliam/article/details/108661710