基于discord.js v13的Discord Bot加入语音频道后无法播放MP3音频
问题排查与修复方案
1. 等待语音连接就绪后再播放音频
你当前的代码在调用joinVoiceChannel后直接触发播放,此时语音连接可能还未完成握手进入就绪状态,导致播放指令被忽略。需要监听连接的状态变更事件,确认连接进入Ready状态后再执行播放逻辑:
const { VoiceConnectionStatus } = require('@discordjs/voice'); connection.on(VoiceConnectionStatus.Ready, () => { console.log('语音连接已就绪,开始播放音频'); player.play(resource); });
2. 补充必要的事件监听排查错误
当前代码没有任何错误监听逻辑,音频解码失败、流读取异常、播放错误等问题都会被静默吃掉,补充以下监听代码获取错误信息:
// 监听播放器错误 player.on('error', error => { console.error('播放器错误:', error); }); // 监听音频资源播放结束/失败事件 resource.on('error', error => { console.error('音频资源错误:', error); }); // 监听连接状态异常 connection.on('error', error => { console.error('语音连接错误:', error); });
3. 检查网关意图配置
discord.js v13 要求必须启用GUILD_VOICE_STATES意图才能正常处理语音相关逻辑:
- 前往Discord开发者门户的机器人设置页,开启
Privileged Gateway Intents下的Voice State Intent - 初始化Client时确保传入的intents包含
GuildVoiceStates,示例:
const { Client, Intents } = require('discord.js'); const client = new Client({ intents: [Intents.FLAGS.Guilds, Intents.FLAGS.GuildVoiceStates, /* 其他你需要的意图 */] });
4. 检查权限与客户端设置
- 确认机器人在目标语音频道拥有
说话、使用语音活动权限 - 检查你的Discord客户端中,该机器人的音量滑块没有被拉到0或者静音
5. 可选:显式指定音频转码逻辑
如果上述步骤都没问题,可以尝试显式通过FFmpeg处理MP3流,避免自动转码失败:
const { createAudioResource, StreamType } = require('@discordjs/voice'); const ffmpeg = require('fluent-ffmpeg'); const audioStream = ffmpeg(join(__dirname, 'resources/try.mp3')) .outputFormat('opus') .audioCodec('libopus') .pipe(); const resource = createAudioResource(audioStream, { inputType: StreamType.Opus, inlineVolume: true });
内容的提问来源于stack exchange,提问作者ChronoAero
相关产品推荐
相关产品推荐

