首页 > 代码库 > PyQt Phonon实现音乐播放器

PyQt Phonon实现音乐播放器

现在网上关于PyQt的文章不多,话说那个官方文档也是烂的一塌糊涂,初次使用Phonon模块遇到很多疑问,

国外网站相关的资料多些,看到一些好的例子记录下来,主要是注释了一下,给后来者一些提示。

# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtCore, QtGui
from PyQt4.phonon import Phonon

class AudioPlayer(QtGui.QWidget):
    def __init__(self, url, parent = None):  
    #url参数就是你的MP3地址  

        self.url = url

        QtGui.QWidget.__init__(self, parent) 

        #设置一些窗口尺寸的策略,不用设置也会有默认策略,干脆注释了,无影响
        # self.setSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Preferred)

	#创建一个音乐播放器  这是一种简单的方法,功能自然也是很单一,貌似只能实现简单的单首歌曲播放(希望我没有猜错,),更灵活的是使用AudioOutput,MediaObject等方法实现
        self.player = Phonon.createPlayer(Phonon.MusicCategory,Phonon.MediaSource(url))
        #下面这句话真没搞懂,谷歌了一下  多次尝试没反应  干脆把他注释了。。不影响程序
        # self.player.setTickInterval(100)
        self.player.tick.connect(self.tock)   #播放进度改变触发事件

        self.play_pause = QtGui.QPushButton(self)  #播放按钮
        self.play_pause.setIcon(QtGui.QIcon('icons/49heart.svg'))  #设置播放按钮图标,jpg,png都可以
        self.play_pause.clicked.connect(self.playClicked)  #播放按钮单击事件
        self.player.stateChanged.connect(self.stateChanged)  #播放状态改变触发事件

        self.slider = Phonon.SeekSlider(self.player , self)  #进度条

        self.status = QtGui.QLabel(self)  #Label组件用来显示播放的当前时间
        self.status.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) #设置Label的对齐方式  左对齐或居中

        layout = QtGui.QHBoxLayout(self)  #水平布局
        layout.addWidget(self.play_pause)   #添加播放按钮
        layout.addWidget(self.slider)  #添加滑动条
        layout.addWidget(self.status)  #添加播放状态

    def playClicked(self):
        if self.player.state() == Phonon.PlayingState:  #如果为播放状态
            self.player.pause()   #暂停
        else:
            self.player.play()    #开始播放

    def stateChanged(self, new, old):
        if new == Phonon.PlayingState:   #根据改变后的状态更换播放图标
            self.play_pause.setIcon(QtGui.QIcon('icons/49heart.svg'))
        else:
            self.play_pause.setIcon(QtGui.QIcon('icons/49heart.svg'))

    def tock(self, time):  #播放进度改变时用来更新上面Label组件里面的当前播放时间time参数就是歌曲当前所在的时间刻,流中的媒体对象的当前位置是由时间参数给出  以毫秒为单位
        time = time/1000   #除以1000得到秒单位
        h = time/3600   #小时
        m = (time-3600*h) / 60  #分钟
        s = (time-3600*h-m*60)  #秒
        self.status.setText('%02d:%02d:%02d'%(h,m,s))  #更新Label显示的播放时间进度

def main():
    app = QtGui.QApplication(sys.argv)
    window=AudioPlayer(sys.argv[1])   #在命令行下的第二个参数 你的歌曲路径
    window.show()  #显示主窗口
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

# 测试:  python mp3player.py  mymusic.mp3

这段代码实现了单首个点播,嵌入到程序中实现简单声音播放还是不错的,如果要做的更专业,更贴近现代化播放器该有的功能,

接下来几篇文章中我会介绍一些更灵活的复杂的功能


PyQt Phonon实现音乐播放器