求助:Discord机器人播放本地音频文件报错,如何解决?
解决Discord机器人播放本地音频的AttributeError问题
我来帮你搞定这个问题!你遇到的AttributeError是因为对discord.py的语音播放API理解有点偏差,咱们一步步拆解解决:
核心错误原因
voice_player.play(source)这个方法本身就会立即开始播放音频,而且它的返回值是None,所以你后面调用player.start()自然会报错——你没法对一个None对象调用方法。
修正后的完整代码
先给你调整好的代码,后面再讲细节:
@client.command() async def play(ctx, *args): if len(args) == 0: await ctx.send("Specify something then") return # 检查用户是否在语音频道里 if not ctx.message.author.voice: await ctx.send("你得先加入一个语音频道才行哦!") return # 复用已有的语音连接,避免重复连接报错 voice_client = ctx.voice_client if not voice_client: voice_client = await ctx.message.author.voice.channel.connect() elif voice_client.is_playing(): # 可选:如果正在播放,先停止当前音频 voice_client.stop() if args[0] == "chulp": print("Playing chulp") # 注意:如果FFmpeg没加入系统环境变量,需要指定完整路径,比如: # source = discord.FFmpegPCMAudio(r"C:\YourBotPath\Core files\Sounds\chulpy.mp3", executable=r"C:\ffmpeg\bin\ffmpeg.exe") source = discord.FFmpegPCMAudio(r"Core files\Sounds\chulpy.mp3") voice_client.play(source)
关键细节说明
- 去掉多余的
.start():discord.py的VoiceClient.play()方法会直接启动播放,不需要额外调用start方法。 - 复用语音连接:每次调用命令都重新connect会导致报错,用
ctx.voice_client检查是否已有连接,有就直接用。 - FFmpeg路径问题:如果你的系统没有把FFmpeg添加到环境变量里,一定要在
FFmpegPCMAudio里通过executable参数指定FFmpeg的完整路径,否则机器人找不到FFmpeg会报错。 - 用户状态检查:添加用户是否在语音频道的判断,避免因为用户没在频道里导致的
AttributeError。
额外提示
测试前记得确认:
- 本地音频文件的路径是正确的(用原始字符串
r"路径"避免转义问题) - FFmpeg已经正确安装,并且机器人有权限访问音频文件
内容的提问来源于stack exchange,提问作者seraph
相关产品推荐
相关产品推荐

