当前位置 主页 > 网站技术 > 代码类 >

    pygame编写音乐播放器的实现代码示例

    栏目:代码类 时间:2019-11-19 12:05

    1、准备工作

    ide:pycharm
    python:3.7
    三方包:pygame、pyinstaller、mutagen
    几首mp3格式的歌

    2、开始

    2.1 设计说明

    1、包含 上一首、下一首、暂停/播放、快进/快退、显示当前播放的歌曲名称、显示播放进度条
    2、使用pygame.mixer
    3、随机播放磁盘某个目录及其子目录下的mp3文件
    4、上一首、下一首用随机选择choice(list) 实现
    5、进度条用按照一定速度移动进度图片来实现,过程中处理暂停、快进
    6、歌曲快进播放用pygame.mixer.music.play(0,d_song_time) 实现
    7、暂停用pygame.mixer.music.pause() 实现
    8、播放用pygame.mixer.music.unpause() 实现
    9、用mutagen.mp3来获取mp3信息

    2.2 代码逻辑

    收集某个目录下的所有mp3

    # 收集某个目录及子目录下的MP3格式的文件
    # 返回歌曲路径、歌曲时长
    # [['E:\\musics\\Mirror_Yohee_128K.mp3', 236], ['E:\\musics\\over here_Nobigdyl_128K.mp3', 188], ['E:\\musics\\尘_薛之谦_128K.mp3', 282], ['E:\\musics\\aaa\\尘_薛之谦_128K.mp3', 282]]
    def collect_songs(fidir):
      musics =[]
      for root, dirs, files in os.walk(fidir):
        for file in files:
          tmp =[]
          if file.endswith('mp3'):
            file = os.path.join(root,file)
            song = MP3(file)
            duration = round(song.info.length)
            tmp.append(file)
            tmp.append(duration)
            musics.append(tmp)
      return musics

    显示歌曲名称

    # 把歌曲名字显示在播放器上
    def draw_song_name(music):
      # 取歌曲名
      music_name = music[0].split("\\")[-1]
      # print(music_name)
      wbk_obj = font_obj.render(music_name, True, (0, 255, 255))
      k_obj = wbk_obj.get_rect()
      k_obj.center = (340, 200)
      screen.blit(wbk_obj, k_obj)
      pygame.display.update()
    

    播放歌曲

    # 随机播放一首歌
    def sing_a_song(musics):
      # 随机选择一首音乐
      music = choice(musics)
      print(type(musics))
      pygame.mixer.music.load(music[0])
      pygame.mixer.music.play()
      print('开始播放:%s -- %s秒'%(music[0] , str(music[1])))
      return music

    显示播放进度

    # 播放进度显示
    def move(current_time,start_time,pause_duration_time,c_music):
      if pause_end_time == 0 and pause_start_time != 0:
        duration_time = round(pause_start_time - start_time - pause_duration_time)
      else:
        duration_time = round(current_time - start_time - pause_duration_time)
      song_total_time = c_music[1]
      speed = (end_x-begin_x)/song_total_time
      current_x = begin_x + duration_time*speed
      try:
        screen.blit(dian,(current_x,148))
        pygame.display.update()
      except:
        print(current_time)
        print(start_time)
        print(pause_duration_time)
        exit()
    

    快进快退功能

    # 快进快退功能
    def kuaijin(jindu_x,c_music):
      # 要跳转到的距离d_x
      d_x = jindu_x - begin_x
      song_total_time = c_music[1]
      # 要跳转到的时间d_song_time
      d_song_time = round(song_total_time*(d_x/560),1)
      # 将歌曲快进到d_song_time
      pygame.mixer.music.play(0,d_song_time)