接下来,我们要实现播放进度。实现原理就不是不断的画白色的矩形,根据播放时间和歌曲总时长的比例计算矩形当前宽度。要解决的问题:
- 如何获取mp3的总时长
- 如何不断重复画矩形?
- 如何画矩形
一、获取mp3的总时长
我们可以使用mutagen模块获取mp3的总时长,以及mp3本身的一些信息。Mutagen是用于处理音频元数据的python模块。它支持ASF、FLAC、MP4、Monkey¡¯s Audio、MP3、Musepack、Ogg Opus、Ogg FLAC、Ogg Speex、Ogg Theora、Ogg Vorbis、True Audio、WavPack、OptimFROG和AIFF 音频文件。 它能精确计算MP3文件的比特率和长度。
1、安装
pip install mutagen
2、使用
from mutagen.mp3 import MP3 #导入
# path是音乐文件名
length = MP3(path)length = mp3_info.info.length # 歌曲时长(秒)
song_name = mp3_info.tags['title'] # 歌名
定义全局字典info,保存mp3本身的信息,然后在播放函数里获取mp3的信息
MP3_INFO = {} # 全局字典
# 播放指定的歌曲
def play(index): # index 列表的下标
pygame.mixer.music.stop()
# 播放音乐
music = pygame.mixer.music.load(song_list[index])
MP3_INFO.clear()
mp3_info = MP3(song_list[index])
MP3_INFO["title"] = str(mp3_info.tags.get("TIT2")) # 标题
MP3_INFO["length"] = mp3_info.info.length # 时长(秒)
pygame.mixer.music.play()
二、用户自定义事件
重复画可以通过用户自定义事件,然后设置定时器,定时触发时间,实现重复画。
用户自定义事件:
RATE = pygame.USEREVENT + 1 # 用户自定义的进度条事件
在主函数中设置定时器:
# 建立一个定时器
# 50毫秒触发一次用户自定义事件
pygame.time.set_timer(RATE, 50)
然后可以判断事件类型是不是我们自定义的事件:
for event in pygame.event.get():
# type事件类型
if event.type == RATE:
pass
三、画图
可以通过pygame中draw模块的函数在窗口上绘图,可以绘制的图形包括:线条、矩形、多边形、圆、椭圆、圆弧等。需要说明的是,屏幕坐标系是将屏幕左上角设置为坐标原点(0, 0)
,向右是x轴的正向,向下是y轴的正向,在表示位置或者设置尺寸的时候,我们默认的单位都是像素。所谓像素就是屏幕上的一个点,你可以用浏览图片的软件试着将一张图片放大若干倍,就可以看到这些点。pygame中表示颜色用的是色光三原色表示法,即通过一个元组或列表来指定颜色的RGB值,每个值都在0~255之间,因为是每种原色都用一个8位(bit)的值来表示,三种颜色相当于一共由24位构成,这也就是常说的“24位颜色表示法”。
画长方形:
PROGRESSPOS = pygame.Rect(108,254,289,9) # 进度条,全局变量
if event.type == RATE:
if pygame.mixer.music.get_busy(): # 如果正在播放
# 获取歌曲总时长
length = MP3_INFO["length"] # 秒
# 获取当前播放的时间
current = pygame.mixer.music.get_pos() / 1000 # 毫秒
current %= length # 如果循环播放,需要处理
rate = current / length
rec = PROGRESSPOS.copy()
rec.width = PROGRESSPOS.width * rate # 长方形宽度
# 恢复背景颜色
screen.blit(background, PROGRESSPOS.topleft, PROGRESSPOS)
# 画长方形
pygame.draw.rect(screen, "white", rec)
pygame.display.flip()
现在我们已经实现了进度条。