使用pygame播放音乐

目录

 

一、创作灵感 

二、创作思路

三、涉及模块和第三方库

1、需要手动安装第三方库:

2、第三方库简介:

四、功能实现

1、音乐片段的时间检测

2、音乐文件加载到待播放列表

3、播放音乐

4、循环顺序播放音乐

5、循环随机播放音乐

五、所有代码

六、总结

一、创作灵感 
  • 公司内网无法播放音乐
  • 音乐播放器也无法打开
  • 使用python脚本播放音乐
二、创作思路
  • 播放本地离线mp3
  • 顺序播放、随机播放
  • 歌曲播放彩色进度条
  • 手动切歌
三、涉及模块和第三方库
import os.path
import random
from rich.progress import  Progress
from mutagen.mp3 import MP3

from os import environ
# 隐藏pygame的欢迎语句,否则控制台会打印
environ['PYGAME_HIDE_SUPPORT_PROMPT'] = "hide"
import pygame
import  time
import keyboard
import traceback

1、需要手动安装第三方库:
  • pip install mutagen
  • pip install pygame
  • pip install keyboard
  • pip install rich
2、第三方库简介:
  • mutagen:检测MP3信息,如片段时长
  • pygame:播放mp3音乐
  • keyboard:键盘事件
  • rich:用于在终端中添加丰富的文本(如颜色、粗体、下划线等)、表格、进度条,甚至是 Markdown 的支持
四、功能实现
1、音乐片段的时间检测
  •  具体代码
from mutagen.mp3 import MP3

# 音乐文件所在磁盘目录
basepath = rf'C:\CloudMusic'
# 获取目录下所有音乐文件
filenames = os.listdir(basepath)

def takeMP3Length(filename):
    """
    filename:全路径音乐文件,例如: C:\CloudMusic\初恋-回春丹.mp3
    """
    print("全路径文件名",filename)
    audio = MP3(filename)
    len = audio.info.length
    print("音乐时长:" , len)
    return len

if __name__ == '__main__':
    fullname = os.path.join(basepath, '初恋-回春丹.mp3')
    takeMP3Length(fullname)
  • 输出结果:
全路径文件名 C:\CloudMusic\初恋-回春丹.mp3
音乐时长: 222.36
2、音乐文件加载到待播放列表
  • 具体代码:
import os.path

# 音乐文件所在磁盘目录
basepath = rf'C:\CloudMusic'
# 获取目录下所有音乐文件
filenames = os.listdir(basepath)
def allmusicfile(): 
    # 全路径音乐文件
    for file in filenames:
        _fullpath = os.path.join(basepath,   file)
        print(_fullpath)

if __name__ == '__main__':
    allmusicfile()
  • 输出结果
C:\CloudMusic\三年的赌注.mp3
C:\CloudMusic\刘德华 - 暗里着迷 (Live).mp3
C:\CloudMusic\初恋-回春丹.mp3
C:\CloudMusic\千年等一回.mp3
C:\CloudMusic\只只 - 永不失联的爱 单依纯 [高质量](翻自 周兴哲).mp3
C:\CloudMusic\吸引力合唱组 - 白龙马.mp3
C:\CloudMusic\徐小凤-风的季节.mp3
C:\CloudMusic\快来嘛.mp3
C:\CloudMusic\李国祥 - 摘星的晚上.mp3
C:\CloudMusic\直到世界尽头.mp3
C:\CloudMusic\程响-可能.mp3
C:\CloudMusic\羽泽 - 不服(翻自 汪苏泷).mp3
C:\CloudMusic\胡彦斌 - 红颜.mp3
C:\CloudMusic\黄渤,王宝强,张艺兴 - 最好的舞台.mp3
C:\CloudMusic\黄渤,黄磊,罗志祥 - 男人的事.mp3
3、播放音乐
  • 具体代码
from rich.progress import  Progress
import pygame
import  time
import keyboard
import traceback

# 音乐文件所在磁盘目录
basepath = rf'C:\CloudMusic'
# 获取目录下所有音乐文件
filenames = os.listdir(basepath)

def playMp3(filename ):
    try:
        # print(f"全路径:{filename}")
        pygame.mixer.init() # 初始化播放器
        pygame.mixer.music.load(filename) # 加载音乐
        pygame.mixer.music.play() # 播放音乐
        lenSong = takeMP3Length(filename) # 获取音乐时长
        bar = 100/lenSong # 获取进度条步长
        with Progress() as progress: # 创建进度条对象
            songName = os.path.basename(filename) # 获取文件名称,非全路径
            # 进度条对象添加任务
            task1 = progress.add_task(f'[green]开始播放歌曲:{songName}', total=100)
            # 更新进度条任务的描述内容
            progress.update(task1, description=f"[green]正在播放歌曲:{songName}")
            # 通过音乐时长判断播放结束,音乐pygame播放后脚本不能停,否则音乐也会结束
            while lenSong >0 :
                # 检测键盘事件,若按下“]”则切歌,按住至少1秒多再松开,因为当前循环停了1秒
                if  keyboard.is_pressed("]") :
                    pygame.mixer.music.stop()
                    break
                # 更新进度条进度
                progress.update(task1, advance=bar ) 
                # 停一秒,音乐时长减1,
                time.sleep(1)
                lenSong -= 1
            # 当前音乐播放结束时,提示播放完毕
            progress.update(task1, description=f"[green]{songName}播放完毕")
    except Exception as e:
        # 若当前音乐类似格式无法播放的情况则抓取,不影响下一个音乐的播放
        print(traceback.format_exc())

if __name__ == '__main__':
    fullname = os.path.join(basepath, '初恋-回春丹.mp3')
    playMp3(fullname)
  • 输出结果:
正在播放歌曲:初恋-回春丹.mp3 ━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━   8% 0:03:26
  • 实际效果:

第一条进度条没结束,但是文字显示播放完毕,是应为我通过手动切歌了

4、循环顺序播放音乐

调整‘音乐文件加载到待播放列表’小节的代码,本次将所有音乐循环顺序播放

  • 具体代码

    仅展示循环部分的代码,调用的代码请向上查找

def  orderPlay():
    """
    顺序播放
    :return:
    """
    # 循环播放
    while True:
        # 按顺序提取列表中的音乐文件
        for file in filenames:
            _fullpath = os.path.join(basepath,   file)
            # 播放音乐
            playMp3(_fullpath)
            # 一首歌播完了,间隔5秒
            time.sleep(5)
        time.sleep(5)


if __name__ == '__main__':
    
    orderPlay()
  • 实际效果:

5、循环随机播放音乐
import random

def  randomPlay():
    """
    随机播放
    :return:
    """
    while True:
        # 在音乐文件列表中随机挑选歌曲文件
        _songname=random.choice(filenames)
        _fullpath = os.path.join(basepath, _songname )
        playMp3(_fullpath  )
        time.sleep(5)


if __name__ == '__main__':
    randomPlay()
  • 实际效果:

随机播放的同时,可手动切歌

五、所有代码

脚本执行前请调整音乐文件所在目录,变量名为basepath

若第三方库已安装(可参考第三章安装方式),本节代码可直接执行

# -*-coding:utf-8-*-
"""
@Project :learnlangchain 
@python: python 3.10
@创建人员: qiwu
@创建时间: 2024/5/10
"""
import os.path
import random
from rich.progress import  Progress
from mutagen.mp3 import MP3

from os import environ
environ['PYGAME_HIDE_SUPPORT_PROMPT'] = "hide"
import pygame
import  time
import keyboard
import traceback

# 音乐文件目录
basepath = r'C:\CloudMusic'
filenames = os.listdir(basepath)

def takeMP3Length(filename):
    """
    filename:全路径音乐文件,例如: C:\CloudMusic\初恋-回春丹.mp3
    """
    # print("全路径文件名",filename)
    audio = MP3(filename)
    len = audio.info.length
    # print("音乐时长:" , len)
    return len

"""
播放pm3
"""
def playMp3(filename ):
    try:
        # print(f"全路径:{filename}")
        pygame.mixer.init()
        pygame.mixer.music.load(filename)
        pygame.mixer.music.play()
        lenSong = takeMP3Length(filename)
        bar = 100/lenSong
        with Progress() as progress:
            songName = os.path.basename(filename)
            task1 = progress.add_task(f'[green]开始播放歌曲:{songName}', total=100)
            progress.update(task1, description=f"[green]正在播放歌曲:{songName}")
            while lenSong >0 :
                if  keyboard.is_pressed("]") :
                    pygame.mixer.music.stop()
                    break
                progress.update(task1, advance=bar ) 
                time.sleep(1)
                lenSong -= 1
            progress.update(task1, description=f"[green]{songName}播放完毕")
    except Exception as e:
        print(traceback.format_exc(),filename)
def  orderPlay():
    """
    顺序播放
    :return:
    """
    while True:
        for file in filenames:
            _fullpath = os.path.join(basepath,   file)
            playMp3(_fullpath)
            time.sleep(5)
        time.sleep(5)

def  randomPlay():
    """
    随机播放
    :return:
    """
    while True:
        _songname=random.choice(filenames)
        _fullpath = os.path.join(basepath, _songname )
        playMp3(_fullpath  )
        time.sleep(5)

def allmusicfile(): 
    # 全路径音乐文件
    for file in filenames:
        _fullpath = os.path.join(basepath,   file)
        print(_fullpath)
if __name__ == '__main__':

    # 顺序播放
    # orderPlay()
    # 随机播放
    randomPlay()
六、总结

通过该脚本可在公司内网自由听音乐,觉得有用点点赞,点关注不迷路哦

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值