Discord.py中Bot可加入语音频道但无声音输出问题求助
问题描述
为Discord服务器开发音乐机器人,因youtube-dl被屏蔽选择Wavelink实现。执行!play命令后,机器人能识别请求并加入语音频道,但无声音输出,也未显示绿色状态圈;改用FFmpeg编写测试代码,机器人仅加入频道后退出,仍无声音。控制台无报错信息。
问题代码
import discord import wavelink from discord.ext import commands class Bot(commands.Bot): def __init__(self) -> None: intents = discord.Intents(messages=True, guilds=True, reactions=True, members=True, presences=True) intents.message_content = True super().__init__(intents=intents, command_prefix='!') async def on_ready(self) -> None: print(f'Logged in {self.user} | {self.user.id}') async def setup_hook(self) -> None: # Wavelink 2.0 has made connecting Nodes easier... Simply create each Node # and pass it to NodePool.connect with the client/bot. node: wavelink.Node = wavelink.Node(uri='https://lava1.horizxon.tech:443', password='horizxon.tech', secure=True) await wavelink.NodePool.connect(client=self, nodes=[node]) bot = Bot() levels = {} @bot.command() async def play(ctx: commands.Context, *, search: str) -> None: """Простая команда воспроизведения.""" if not ctx.voice_client: vc: wavelink.Player = await ctx.author.voice.channel.connect(cls=wavelink.Player) else: vc: wavelink.Player = ctx.voice_client tracks = await wavelink.YouTubeTrack.search(search) if not tracks: await ctx.send(f'Сори броу, я не нашёл этого трека: `{search}`') return track = tracks[0] await vc.play(track) await ctx.send(f"Сейчас играет: ***{track}***") @bot.command() async def stop(ctx: commands.Context) -> None: """Simple disconnect command. This command assumes there is a currently connected Player. """ vc: wavelink.Player = ctx.voice_client await vc.disconnect() await ctx.send(f"стоп")
解决方案
1. 验证Lavalink节点连接状态
控制台无报错不代表Lavalink节点已成功连接,添加节点监听事件确认连接状态:
# 在Bot类中添加以下方法 async def on_wavelink_node_ready(self, node: wavelink.Node) -> None: print(f"Lavalink节点 {node.id} 已成功连接")
运行机器人后,如果控制台未打印该信息,说明节点连接失败,需检查节点地址、密码是否正确,或者更换可用的Lavalink节点。
2. 修正语音连接参数
机器人加入语音频道时需开启自身 deaf 状态,否则可能无法正常播放音频,修改play命令中的连接逻辑:
if not ctx.voice_client: # 添加self_deaf=True参数 vc: wavelink.Player = await ctx.author.voice.channel.connect(cls=wavelink.Player, self_deaf=True) else: vc: wavelink.Player = ctx.voice_client
3. 检查机器人权限
确保机器人在目标服务器的角色拥有以下权限:
- 连接语音频道
- 在语音频道发言
- 读取消息内容(已通过intents设置,但需确认服务器权限未限制)
4. 处理Player播放状态异常
添加Player的错误监听事件,捕获播放时的潜在错误:
# 在Bot类中添加以下方法 async def on_wavelink_track_exception(self, payload: wavelink.TrackExceptionPayload) -> None: print(f"播放出错: {payload.exception}") await payload.player.channel.send(f"播放失败: {payload.exception}")
5. FFmpeg测试问题排查
若使用FFmpeg,需确保:
- 系统已安装FFmpeg,并将其路径加入环境变量
- 在代码中指定FFmpeg可执行文件路径(若环境变量未配置):
# 示例FFmpeg播放代码 source = discord.FFmpegPCMAudio(executable="/path/to/ffmpeg", source="audio_file.mp3") vc.play(source)
内容的提问来源于stack exchange,提问作者MrGr1zz62
相关产品推荐
相关产品推荐

