目录
一、创作灵感
- 公司内网无法播放音乐
- 音乐播放器也无法打开
- 使用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()
六、总结
通过该脚本可在公司内网自由听音乐,觉得有用点点赞,点关注不迷路哦