IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 使用python加PyQt5,利用QMediaPlayer写一个简易的音乐播放器(进度条拖动,音量改变,播放停止切换,歌曲列表)) -> 正文阅读

[Python知识库]使用python加PyQt5,利用QMediaPlayer写一个简易的音乐播放器(进度条拖动,音量改变,播放停止切换,歌曲列表))

当你学习了python之后,总想着利用它去做些什么,无论是制作小工具还是小游戏,都是一种锻炼。
那么,利用python加上PyQt5写一个简单的音乐播放器,可能会是一个有趣的体验。
下面我会分享一下如何编写简易的音乐播放器,其中参考了网络上的很多程序,当然网络上的程序,很少能够直接复制就满足使用的,为了实现播放器的导入歌曲、双击播放、拖动进度条、音量条拖动、快进、快退等功能,需要进行很多次的测试,最终还是实现了,虽然依旧是比较简陋,但对于一个初学者来说,足以产生一些自豪的心思了。

界面:
在这里插入图片描述
界面比较简单,并没有进行美化,因为目前主要以实现功能为主,程序启动后,点击“导入歌曲”导入歌曲列表,当你选择了文件夹后,程序会将你的歌曲全部导入到歌曲列表中,此时,你选择一首歌曲,双击即可播放。
播放界面上有进度条和音量条,都可以拖动改变进度和音量,右侧有一个三角形小按钮,是播放/暂停按钮,默认是播放状态。
快进、快退按钮,按下去会按固定时长前进或者后退,设定是2s钟,可以自定义。

好了,介绍完了,下面看下程序:

01 导入歌曲:

    def musicfile(self):
        #获取歌曲所在文件夹路径
        self.qlist.clear()
        self.cur_path=QFileDialog.getExistingDirectory(self, "选取文件夹", 'D:/')
        #print(self.cur_path)
        #将文件夹中的所有歌曲添加到List中
        for song in os.listdir(self.cur_path):
            self.songs_list.append([song, os.path.join(self.cur_path, song).replace('\\', '/')])
            self.qlist.addItem(song)
            #print(song)

02 双击播放:

 def doubleplay(self):
        self.is_playing=False
        self.slider.setValue(0)
        self.choosesongname()
        self.is_playing=True
        self.volunm_slider.setValue(3)
        self.play_or_stop()

    def play_or_stop(self):
        if self.qlist.count()==0:
            QMessageBox.about(self,'tips','no music')
            return

        if not self.player.isAudioAvailable():
            self.choosesongname()
            self.lbl_musicname.setText('歌曲名:' + self.playsongname)
            self.lbl_musicname.adjustSize()
            #print(self.slider.maximum())
        if self.is_pause:
            self.player.play()
            #self.play_btn.setText('暂停')
            self.is_pause=False
            self.play_btn.setIcon(QIcon(QPixmap("stopbtn.png")))
        elif  self.is_pause == False:
            self.player.pause()
            #self.play_btn.setText('播放')
            self.is_pause=True

            self.play_btn.setIcon(QIcon(QPixmap("playbtn.png")))

03 调整音量:

  def songvolunm(self):

        self.volumevalue=self.volunm_slider.value()

        self.player.setVolume(self.volumevalue)

        self.lbl_volunm.setText(str(self.volumevalue))
        self.lbl_volunm.adjustSize()

        #print(self.volunm_slider.value())
        #print(self.player.volume())
        #print(self.volumevalue)

音量和歌曲进度条都是使用的pyqt5中的Qslider控件,函数触发在Qslider的槽信号中:

  self.slider=QSlider(Qt.Horizontal, self)
        self.setStyle(QStyleFactory.create('Fusion'))

        self.slider.setMinimum(0)
        self.slider.setMaximum(1000)
        #self.slider.valueChanged.connect(self.songposition)
        self.slider.sliderMoved.connect(self.songposition)
        self.slider.sliderPressed.connect(self.sl_pr)
        self.slider.sliderReleased.connect(self.sl_re)
        self.slider.valueChanged.connect(self.sl_vc)

        self.volunm_slider=QSlider(Qt.Horizontal, self)
        self.volunm_slider.setGeometry(250,120,100,20)
        self.volunm_slider.setMinimum(0)
        self.volunm_slider.setMaximum(100)
        self.volunm_slider.valueChanged.connect(self.songvolunm)

例如其中的valuechanged、slidermoved等,都是监控进度条的鼠标操作的。

04 拖动歌曲进度:

    def musictime(self):

        if self.is_playing:
            self.slider.setMinimum(0)
            self.slider.setMaximum(int(self.player.duration()/1000))

            #self.slider.setValue(self.slider.value() + 1000)

        self.label1.setText(time.strftime('%M:%S', time.localtime(self.player.position() / 1000)))
        self.label2.setText(time.strftime('%M:%S', time.localtime(self.player.duration() / 1000)))
        #self.slider.setMaximum(int(self.player.duration()/1000))
        #print(int(self.player.duration()/1000))
        self.cur_posi = int(self.player.position()/1000)
        #self.sliderposi = self.slider.value()
        #print(self.cur_posi)
        self.slider.setValue(self.cur_posi)
        #print(self.cur_posi)
    def sl_re(self):
        self.player.setPosition(self.slider.value()*1000)
        self.timer.start()
        print(self.player.duration())

关于拖动歌曲进度这个,还稍微费了点功夫,本人并非python高手,只是一个学习者,所以为了实现歌曲进度条随播放滑动,当手动拖动进度条时,歌曲进度跟随变化,这一个功能,测试了很多次,最后还是实现了。
就是上面的这两个函数,一个使用了Qtimer,用定时器定时更新歌曲播放进度,另一个是使用Qslider的release触发。

05 快进快退:

 def setsongposi_fwd(self):

        self.p=self.player.position()+2000
        self.player.setPosition(self.p)

    def setsongposi_bkd(self):
        self.pp=self.player.position()-2000
        self.player.setPosition(self.pp)

这个比较简单,改变qmediaplay的当前位置即可。

上面就是几个主要功能的实现,下面把完整程序贴出来。
需要说明的是,这个简易播放器程序,我测试是完全正常使用,上面所说的功能都可以实现。如果你直接复制过去,出现问题,欢迎讨论,我知道的,会回复,我也不懂得,那就没办法了。

'''名称:风尘音乐播放器
   版本:V0.1
   作者:菌尘
'''
import os
import sys
import time
import random
import configparser
import ffmpeg
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtMultimedia import *


class mmwin(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()



    def initUI(self):

        self.songs_list=[]

        self.is_playing=False
        self.is_pause=True

        self.layout=QVBoxLayout()

        self.gb1=QGroupBox('正在播放', self)
        self.gb1.setGeometry(200, 50, 400, 60)

        self.gb2=QGroupBox('个人中心', self)
        self.gb2.setGeometry(20, 40, 80, 300)

        self.gb3=QGroupBox('歌曲列表', self)
        self.gb3.setGeometry(200, 180, 300, 130)

        self.h1_layout=QHBoxLayout()
        self.h2_layout=QHBoxLayout()

        self.myfont = QFont('Microsoft YaHei',  20)

        self.my_btn=QPushButton('我的主页', self)
        self.my_btn.setStyle(QStyleFactory.create('Fusion'))
        self.my_btn.setGeometry(30,60,60,20)

        self.fav_btn=QPushButton('收藏页',self)
        self.fav_btn.setStyle(QStyleFactory.create('Fusion'))
        self.fav_btn.setGeometry(30, 100, 60, 20)



        self.lbl_musicname=QLabel('', self)
        self.lbl_musicname.setGeometry(230, 65, 20, 20)
        self.lbl_musicname.adjustSize()

        self.label1 = QLabel('00:00', self)
        self.label1.setStyle(QStyleFactory.create('Fusion'))
        self.label1.setGeometry(170, 60, 20, 20)
        self.label1.adjustSize()

        self.label2 = QLabel('00:00', self)
        self.label2.setStyle(QStyleFactory.create('Fusion'))
        self.label2.setGeometry(605, 60, 20, 20)
        self.label2.adjustSize()

        self.lbl_vol_name=QLabel('音量',self)
        self.lbl_vol_name.setStyle(QStyleFactory.create('Fusion'))
        self.lbl_vol_name.setGeometry(220,120,20,20)
        self.lbl_vol_name.adjustSize()

        self.lbl_volunm=QLabel('0',self)
        self.lbl_volunm.setGeometry(355,125,20,20)
        self.lbl_volunm.adjustSize()

        self.player=QMediaPlayer()
        self.player.setVolume(3)
        self.player.stateChanged.connect(self.do_mediaplayer_statechanged)

        self.posi_fwd_btn=QPushButton('快进', self)
        self.posi_fwd_btn.setStyle(QStyleFactory.create('Fusion'))
        self.posi_fwd_btn.setGeometry(400,120,60,20)
        self.posi_fwd_btn.setIcon(QIcon("C:/Users/rongjv/Desktop/快进.jfif"))
        self.posi_fwd_btn.clicked.connect(self.setsongposi_fwd)

        self.posi_bkd_btn=QPushButton('后退',self)
        self.posi_bkd_btn.setStyle(QStyleFactory.create('Fusion'))
        self.posi_bkd_btn.setGeometry(500,120,60,20)
        self.posi_bkd_btn.setIcon(QIcon("C:/Users/rongjv/Desktop/快退.jfif"))
        self.posi_bkd_btn.clicked.connect(self.setsongposi_bkd)


        self.slider=QSlider(Qt.Horizontal, self)
        self.setStyle(QStyleFactory.create('Fusion'))

        self.slider.setMinimum(0)
        self.slider.setMaximum(1000)
        #self.slider.valueChanged.connect(self.songposition)
        self.slider.sliderMoved.connect(self.songposition)
        self.slider.sliderPressed.connect(self.sl_pr)
        self.slider.sliderReleased.connect(self.sl_re)
        self.slider.valueChanged.connect(self.sl_vc)

        self.volunm_slider=QSlider(Qt.Horizontal, self)
        self.volunm_slider.setGeometry(250,120,100,20)
        self.volunm_slider.setMinimum(0)
        self.volunm_slider.setMaximum(100)
        self.volunm_slider.valueChanged.connect(self.songvolunm)

        self.open_btn=QPushButton('导入歌曲', self)
        self.open_btn.setStyle(QStyleFactory.create('Fusion'))
        self.open_btn.setGeometry(30, 140, 60, 20)
        self.open_btn.clicked.connect(self.musicfile)

        self.play_btn = QPushButton('', self)
        self.play_btn.setStyle(QStyleFactory.create('Fusion'))
        self.play_btn.setGeometry(520, 85, 20, 25)
        self.play_btn.setIcon(QIcon(QPixmap("playbtn.png")))
        self.play_btn.clicked.connect(self.play_or_stop)

        self.qlist=QListWidget(self)
        self.qlist.doubleClicked.connect(self.doubleplay)
        #self.qlist.setStyle(QStyleFactory.create('Fusion'))
        self.qlist.setGeometry(200, 200, 300, 120)

        self.timer=QTimer(self)
        self.timer.start(100)
        self.timer.timeout.connect(self.musictime)

        #测试用
        #self.lbl_text=QLabel(self)
        #self.lbl_text.setGeometry(400,20,100,20)
        #self.lbl_text.setText('000')


        #设置窗口布局
        self.h1_layout.addWidget(self.slider)
        self.gb1.setLayout(self.h1_layout)

        #self.h2_layout.addWidget(self.my_btn)
        #self.h2_layout.addWidget(self.fav_btn)
        #self.gb2.setLayout(self.h2_layout)

        self.setGeometry(200, 200, 800, 400)
        self.setWindowTitle('风尘播放器')
        self.setWindowIcon(QIcon("E:/10 临时图片/CoDeSys.ico"))
        self.show()

    def do_mediaplayer_statechanged(self,state):
        if state == QMediaPlayer.PlayingState:
            pass
        if state == QMediaPlayer.PausedState:
            pass
        if state == QMediaPlayer.StoppedState:
            self.is_pause = True


    def sl_pr(self):

        self.timer.stop()
        self.cur_posi=self.slider.value()

    def sl_re(self):
        self.player.setPosition(self.slider.value()*1000)
        self.timer.start()
        print(self.player.duration())
    def sl_vc(self):
        ...
        #self.lbl_text.setText(str(self.slider.value()))




    def songvolunm(self):

        self.volumevalue=self.volunm_slider.value()

        self.player.setVolume(self.volumevalue)

        self.lbl_volunm.setText(str(self.volumevalue))
        self.lbl_volunm.adjustSize()

        #print(self.volunm_slider.value())
        #print(self.player.volume())
        #print(self.volumevalue)

    def songposition(self):


        #self.timer.stop()
        self.p1=self.player.duration()
        self.p2=self.p1 / 1000
        self.p3=self.slider.value() * self.p2
        self.ppp = self.slider.value()
        #print(self.p1)
        #print(self.p2)
        #print(self.p3)
        #self.player.setPosition(int(self.p3))
        #self.label1.setText(time.strftime('%M:%S', time.localtime(self.player.position() / 1000)))

    def setsongposi_fwd(self):

        self.p=self.player.position()+2000
        self.player.setPosition(self.p)

    def setsongposi_bkd(self):
        self.pp=self.player.position()-2000
        self.player.setPosition(self.pp)

    def musicfile(self):
        #获取歌曲所在文件夹路径
        self.qlist.clear()
        self.cur_path=QFileDialog.getExistingDirectory(self, "选取文件夹", 'D:/')
        #print(self.cur_path)
        #将文件夹中的所有歌曲添加到List中
        for song in os.listdir(self.cur_path):
            self.songs_list.append([song, os.path.join(self.cur_path, song).replace('\\', '/')])
            self.qlist.addItem(song)
            #print(song)


    def musictime(self):

        if self.is_playing:
            self.slider.setMinimum(0)
            self.slider.setMaximum(int(self.player.duration()/1000))

            #self.slider.setValue(self.slider.value() + 1000)

        self.label1.setText(time.strftime('%M:%S', time.localtime(self.player.position() / 1000)))
        self.label2.setText(time.strftime('%M:%S', time.localtime(self.player.duration() / 1000)))
        #self.slider.setMaximum(int(self.player.duration()/1000))
        #print(int(self.player.duration()/1000))
        self.cur_posi = int(self.player.position()/1000)
        #self.sliderposi = self.slider.value()
        #print(self.cur_posi)
        self.slider.setValue(self.cur_posi)
        #print(self.cur_posi)




    def choosesongname(self):

        self.index = self.qlist.currentRow()
        self.playsong = self.songs_list[self.index][-1]
        self.playsongname=self.songs_list[self.index][0]
        self.playsong1 = self.playsong.replace('\\', '/')
        #print(self.playsong1)
        self.get_music_info(self.playsong1)
        self.player.setMedia(QMediaContent(QUrl(self.playsong)))




    def doubleplay(self):
        self.is_playing=False
        self.slider.setValue(0)
        self.choosesongname()
        self.is_playing=True
        self.volunm_slider.setValue(3)
        self.play_or_stop()

    def play_or_stop(self):
        if self.qlist.count()==0:
            QMessageBox.about(self,'tips','no music')
            return

        if not self.player.isAudioAvailable():
            self.choosesongname()
            self.lbl_musicname.setText('歌曲名:' + self.playsongname)
            self.lbl_musicname.adjustSize()
            #print(self.slider.maximum())
        if self.is_pause:
            self.player.play()
            #self.play_btn.setText('暂停')
            self.is_pause=False
            self.play_btn.setIcon(QIcon(QPixmap("stopbtn.png")))
        elif  self.is_pause == False:
            self.player.pause()
            #self.play_btn.setText('播放')
            self.is_pause=True

            self.play_btn.setIcon(QIcon(QPixmap("playbtn.png")))

    def get_music_info(self,filename):
        self.fl=filename
        #print(self.fl)
        #self.probe = ffmpeg.probe(self.fl)
        #self.format = self.probe['format']
        #(self.format)


if __name__ =='__main__':

    app=QApplication(sys.argv)
    ex=mmwin()
    sys.exit(app.exec_())

最后说明以下,里面用到的播放、暂停按钮的图片是我自己画的,如果你复制过去,需要自己提供正确的图片路径,以及窗口标题图片。




  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-05-01 15:42:14  更:2022-05-01 15:43:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 16:57:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码