You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 02:36:01