Pycord中无需调用connect播放音频?解决已连接时调用connect报错问题
解决Pycord机器人重复连接语音频道报错问题
你的问题出在每次执行play命令时都无条件调用await channel.connect()——当机器人已经处于语音频道时,这个操作会触发ClientException: Already connected to a voice channel错误。官方示例大多是演示首次连接的场景,没覆盖重复调用的情况。
解决思路很简单:先检查机器人在当前服务器是否已有活跃的语音连接,有就直接复用,没有再创建新连接。修改后的代码如下:
@bot.slash_command(guild_ids=[]) async def play(ctx, audio): # 先检查用户是否在语音频道里 if not ctx.author.voice: await ctx.respond("你得先加入一个语音频道才行!") return channel = ctx.author.voice.channel voice = ctx.guild.voice_client # 获取当前服务器已有的语音客户端实例 if voice and voice.is_connected(): # 如果已连接,判断是否和用户在同一个频道,不是的话自动移过去 if voice.channel != channel: await voice.move_to(channel) else: # 没有连接的话,创建新连接 voice = await channel.connect() # 可选:停止当前正在播放的音频(如果需要切换歌曲的话) if voice.is_playing(): voice.stop() audio_source = discord.FFmpegPCMAudio(source=f'audio/{audio}.mp3', executable='C:/FFmpeg/bin/ffmpeg.exe') voice.play(audio_source) await ctx.respond(f'Now playing `{audio}`')
关键逻辑说明:
ctx.guild.voice_client:直接获取机器人在当前服务器的语音客户端,避免重复调用connect()- 频道移动判断:如果机器人在其他频道,用户调用命令时自动切换到用户所在频道,不用手动断开重连
- 停止当前播放:如果需要实现点歌切歌的功能,这一步可以确保新音频能立即播放
内容的提问来源于stack exchange,提问作者Sprunk
相关产品推荐
相关产品推荐

