使用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
相关产品推荐
相关产品推荐

