接下来,我们要实现播放进度。实现原理就不是不断的画白色的矩形,根据播放时间和歌曲总时长的比例计算矩形当前宽度。要解决的问题:

  1. 如何获取mp3的总时长
  2. 如何不断重复画矩形?
  3. 如何画矩形

一、获取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位颜色表示法”。

python 播放avi python播放ogg_pygame

画长方形:

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()

现在我们已经实现了进度条。