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

如何实现Pygame随机不重复播放音乐并自动续播?

解决音乐随机播放的重复与自动续播问题

问题分析

  • 歌曲重复:每次调用random.choice()直接从原始列表选歌,未排除已播放曲目
  • 无法自动续播:缺少监听音乐播放状态的逻辑,无法在当前歌曲结束后触发下一首播放

修改方案

  1. 去重原始歌曲列表:先移除列表内重复曲目,避免初始列表自带重复项
  2. 维护待播放队列:用洗牌后的列表作为待播放池,每播放一首就从池中移除,池空后重新洗牌重置
  3. 监听播放状态:通过pygame.mixer.music.get_busy()定时检查播放状态,空闲时自动播放下一首

完整修改代码

import pygame
import random
import time

# 初始化pygame mixer(全局只需要初始化一次)
pygame.mixer.init()

# 去重后的歌曲列表
songs = [
    "sonidos/playlist/cant toch this.mp3", 
    "sonidos/playlist/hey song.mp3",
    "sonidos/playlist/i like to move it.mp3",
    "sonidos/playlist/lets go.mp3",
    "sonidos/playlist/little bit.mp3",
    "sonidos/playlist/ohohoho.mp3",
    "sonidos/playlist/pump it up.mp3",
    "sonidos/playlist/pump up the jum.mp3",
    "sonidos/playlist/seven nation army.mp3",
    "sonidos/playlist/ready for this.mp3",
    "sonidos/playlist/usher yeah.mp3",
    "sonidos/playlist/what is love.mp3"
]

# 待播放队列
play_queue = []

def reset_queue():
    """重置待播放队列,洗牌后重新填充"""
    global play_queue
    shuffled_songs = songs.copy()
    random.shuffle(shuffled_songs)
    play_queue = shuffled_songs

def play_next_song():
    """播放队列中的下一首歌曲"""
    if not play_queue:
        reset_queue()
    selected_song = play_queue.pop(0)
    pygame.mixer.music.load(selected_song)
    pygame.mixer.music.play()
    print(f"正在播放: {selected_song}")

def play_music():
    """启动播放逻辑,包含自动续播"""
    reset_queue()
    play_next_song()
    # 循环检查播放状态(如果是GUI场景,需替换为框架自带定时器,避免阻塞主线程)
    while True:
        if not pygame.mixer.music.get_busy():
            play_next_song()
        time.sleep(0.5)  # 降低CPU占用

# 调用播放函数
play_music()

补充说明

如果是在GUI按钮触发的场景,不要用while True阻塞主线程,应该改用对应GUI框架的定时器(比如Tkinter的after()方法)来周期性检查播放状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 04:05:12