Discord.js语音连接subscribe方法无法检测end事件如何解决
问题原因
以下是导致speaking.end事件无法触发的常见原因,按出现概率排序:
- 缺少必要的Intent配置
使用Discord.js v13及以上版本开发语音功能时,必须在机器人初始化时开启GuildVoiceStates意图,同时如果使用的是@discordjs/voice包,还需要确保你的机器人已经申请到语音接收特权权限——2022年之后Discord对语音接收功能做了限制,未申请权限的机器人无法获取用户语音状态变更通知,也无法接收音频流数据。 - 事件监听逻辑错误
connection.receiver.speaking的end事件触发时会携带停止说话的用户ID作为参数,该事件是全局触发的,不会仅针对你订阅的用户推送,需要在回调中匹配目标用户ID才能正常执行对应逻辑,修正后的示例代码如下:let targetUserId = message.member.user.id let audioStream = connection.receiver.subscribe(targetUserId) audioStream.on('data' , (chunk) => { console.log(chunk) }) connection.receiver.speaking.on('end', (userId) => { if (userId === targetUserId) { console.log("指定用户说话结束") } }) - 音频流订阅提前终止
如果audioStream因为报错、超时或者主动调用了destroy()方法终止,语音接收模块会停止监听对应用户的语音状态,也会导致end事件无法触发,你可以添加额外的事件监听排查流状态:audioStream.on('error', (err) => { console.log('音频流错误', err) }) audioStream.on('close', () => { console.log('音频流已关闭') }) - 语音连接状态异常
确认connection的状态为ready,如果连接处于正在连接、断开重连的状态,接收器不会触发任何语音相关事件,可以添加状态监听确认连接是否正常:connection.on('stateChange', (oldState, newState) => { console.log('语音连接状态变更为', newState.status) })
内容的提问来源于stack exchange,提问作者Joel Wilkås
相关产品推荐
相关产品推荐

