You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pygame.mixer.music遍历播放歌曲失败:仅播放首曲求助

解决Pygame播放列表仅播放第一首歌的问题

你遇到的问题核心在于Pygame的音乐播放是异步的,且pygame.mixer.music是单通道播放——当你在循环里连续调用load()和play()时,下一首音乐的加载会立刻终止当前正在播放的音乐,而程序没有给第一首歌留足播放时间就跳到了下一次循环。虽然你的print(song)能输出所有路径,但每一次load()都会覆盖上一首音乐,导致后续歌曲还没来得及播放就被替换了。

解决步骤:

要实现依次播放列表中的每首歌,你需要在播放当前歌曲后,等待它播放完毕再继续下一首。这里有两种可靠的方法:

方法1:使用pygame.mixer.music.get_busy()等待播放结束

这个方法会持续检查当前是否有音乐在播放,直到播放完毕再进入下一次循环。同时要记得处理Pygame事件,避免程序假死:

def selection():
    pygame.init()  # 确保初始化Pygame mixer(如果还没初始化的话)
    pygame.mixer.init()
    for song in my_music:
        print(song)
        pygame.mixer.music.load(song)
        pygame.mixer.music.play(loops=0)
        # 等待当前歌曲播放完毕
        while pygame.mixer.music.get_busy():
            # 处理事件,防止程序无响应
            pygame.event.poll()
            # 加短延迟降低CPU占用
            pygame.time.delay(100)

方法2:获取音乐时长,用time.sleep()等待

如果你需要更精准的时长控制,可以读取音乐文件的元数据获取时长,再等待对应时间(需额外安装mutagen库):

import time
from mutagen.mp3 import MP3  # 安装命令:pip install mutagen

def get_song_duration(song_path):
    audio = MP3(song_path)
    return audio.info.length

def selection():
    pygame.init()
    pygame.mixer.init()
    for song in my_music:
        print(song)
        pygame.mixer.music.load(song)
        pygame.mixer.music.play(loops=0)
        # 获取歌曲时长并等待播放完成
        duration = get_song_duration(song)
        time.sleep(duration)

额外注意事项:

  • 确保在调用selection()前已经初始化了Pygame和音频模块,否则会出现加载失败的情况。
  • 若使用相对路径存储音乐文件,要确认程序的工作目录与文件路径匹配(你第一首能正常播放,这一点应该没问题)。
  • 如果需要实现暂停、切歌等交互功能,可以结合Pygame的事件监听机制来处理用户输入。

内容的提问来源于stack exchange,提问作者Nikky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:51:34