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

Python开发Discord Bot:自动循环播放WAV音乐故障排查

问题分析与解决方案

你的代码崩溃主要源于几个核心错误,直接导致播放逻辑失效:

  1. 错误使用await调用voice.play():voice.play()是同步方法,无需加await,强行添加会触发异步执行错误。
  2. after参数传递错误:after需要传入同步函数的引用,你直接执行await after_song()会导致程序启动时就触发循环逻辑,而非播放结束后执行。同时after回调函数必须接受一个error参数(即便你不需要处理错误)。
  3. 队列存储对象的问题:直接存储FFmpegPCMAudio对象会导致重复使用时出现资源释放异常,应该存储文件路径,每次播放时创建新的音频实例。

修正后的代码

import discord
import random
from discord.ext import commands
from discord import FFmpegPCMAudio

# 存储文件路径而非FFmpegPCMAudio对象
queue = [
    'Iceland1.wav', 'Iceland2.wav', 'Iceland3.wav', 'Iceland4.wav',
    'Iceland5.wav', 'Iceland6.wav', 'Iceland7.wav', 'Iceland8.wav',
    'Iceland9.wav', 'Iceland10.wav', 'Norway1.wav', 'Norway2.wav',
    'Norway3.wav', 'Norway4.wav', 'Norway5.wav', 'Norway6.wav',
    'Norway7.wav', 'Norway8.wav', 'Norway9.wav', 'Norway10.wav',
    'Norway11.wav', 'Presents1.wav', 'Presents2.wav', 'Presents3.wav',
    'Presents4.wav', 'Presents5.wav', 'Presents6.wav', 'Presents7.wav',
    'Presents8.wav', 'Presents9.wav', 'Presents10.wav', 'Autumn1.wav',
    'Autumn2.wav', 'Autumn3.wav', 'Autumn4.wav', 'Autumn5.wav',
    'Autumn6.wav', 'Autumn7.wav', 'Autumn8.wav', 'Covers1.wav',
    'Covers2.wav', 'Covers3.wav', 'Covers4.wav', 'Covers5.wav',
    'Covers6.wav', 'Covers7.wav', 'Covers8.wav', 'Covers9.wav',
    'Covers10.wav', 'Covers11.wav', 'Covers12.wav'
]

intents = discord.Intents.default()
intents.message_content = True
client = commands.Bot(command_prefix='>', intents=intents)

@client.event
async def on_ready():
    print("The Matt Bot is ready")
    print("--------------------------")
    await client.change_presence(activity=discord.Game('Matt Krupa'))
    channel = client.get_channel(thechannelid)  # 替换成你的频道ID
    voice_client = await channel.connect()
    random.shuffle(queue)

    def play_next(error=None):
        # 可选:处理播放错误
        if error:
            print(f"播放出错: {error}")
        # 将当前歌曲移到队列末尾,实现无限循环
        current_song = queue.pop(0)
        queue.append(current_song)
        # 创建新的音频实例并播放
        audio_source = FFmpegPCMAudio(current_song)
        voice_client.play(audio_source, after=play_next)

    # 启动首次播放
    first_song = queue.pop(0)
    queue.append(first_song)
    initial_audio = FFmpegPCMAudio(first_song)
    voice_client.play(initial_audio, after=play_next)

client.run('你的Bot令牌')

关键改动说明

  • 队列存储路径:将FFmpegPCMAudio对象替换为文件路径,每次播放时创建新的音频实例,避免资源复用导致的异常。
  • 修正after回调:play_next是符合要求的同步函数,接受error参数,播放结束后Discord.py会自动调用它,完成循环逻辑。
  • 移除多余await:voice_client.play()是同步方法,直接调用即可,无需await。
  • 循环逻辑优化:用pop(0)取出当前歌曲并追加到队列末尾,实现所有歌曲的无限循环播放。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 22:35:09