Python开发Discord Bot:自动循环播放WAV音乐故障排查
问题分析与解决方案
你的代码崩溃主要源于几个核心错误,直接导致播放逻辑失效:
- 错误使用
await调用voice.play():voice.play()是同步方法,无需加await,强行添加会触发异步执行错误。 after参数传递错误:after需要传入同步函数的引用,你直接执行await after_song()会导致程序启动时就触发循环逻辑,而非播放结束后执行。同时after回调函数必须接受一个error参数(即便你不需要处理错误)。- 队列存储对象的问题:直接存储
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
相关产品推荐
相关产品推荐

