DiscordJSv14语音监听机器人无法接收音频数据包问题求助
问题排查与解决方案
核心问题
你当前代码里用connection.receiver.subscribe(ID)订阅的是机器人自身的ID,但Discord的语音机制不会把机器人自己发送的音频回传给它的语音接收器,所以永远触发不了data事件,自然看不到chunk输出。
针对性解决方案
场景1:监听频道内其他用户的音频
如果需求是捕获语音频道里其他用户的音频,得订阅频道内其他成员的ID,而非机器人自身ID,示例代码如下:
if (isListener) { console.log("Listener Is Joining Voice And Listening..."); const encoder = new OpusEncoder(48000, 2); const voiceChannel = guild.channels.cache.get(C.id); // 遍历语音频道内所有成员 voiceChannel.members.forEach(member => { // 跳过机器人自己 if (member.id === this.client.user.id) return; // 订阅该用户的音频流 const subscription = connection.receiver.subscribe(member.id, { end: { behavior: EndBehaviorType.AfterSilence, duration: 1000 } }); subscription.on("data", (chunk) => { console.log(encoder.decode(chunk)); // 此处可将解码后的音频发送至目标机器人 }); // 监听订阅错误,方便排查问题 subscription.on("error", (err) => { console.error("音频订阅出错:", err); }); }); }
场景2:捕获机器人自身发送的音频
如果需求是转发机器人自己输出的音频,不能用receiver实现,得在音频发送环节监听数据流:
// 假设使用createAudioPlayer播放音频 const player = createAudioPlayer(); const resource = createAudioResource('./audio.mp3'); // 在resource的数据流上监听输出的音频数据 resource.stream.on('data', (chunk) => { console.log("自身输出音频chunk:", chunk); // 此处可将音频数据发送至目标机器人 }); player.play(resource); connection.subscribe(player);
额外注意事项
- 确保
@discordjs/opus已正确安装,版本与DiscordJS v14兼容(建议用最新稳定版)。 selfDeaf: false配置正确,这是机器人能接收频道音频的前提。- 可添加
connection.on('error')监听语音连接错误,排查潜在连接问题。
内容的提问来源于stack exchange,提问作者ChezyName
相关产品推荐
相关产品推荐

