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

开发的Discord机器人进入语音频道后无法播放音频,求助(附代码)

问题分析与修复方案

你的代码存在几个核心问题,导致无法播放音频:

  • 重复导入并错误初始化了DisTube,同时混用了原生@discordjs/voice的播放器——DisTube已经封装了语音连接和播放逻辑,不需要手动调用joinVoiceChannel和createAudioPlayer
  • 仅建立了语音连接,但没有将提取到的YouTube URL传给播放器处理
  • 参数提取逻辑有缺陷,split(' ')会在链接包含空格时失效,且只取了单个参数
  • 缺少用户是否在语音频道的校验,可能触发报错
  • 没有添加DisTube的事件监听,无法排查播放错误

修正后的代码:

const { DisTube } = require('distube');
// 正确初始化DisTube,传入客户端实例和必要配置
const distube = new DisTube(client, {
  emitNewSongOnly: true,
  leaveOnFinish: true, // 播放结束后自动离开频道
  leaveOnEmpty: true, // 频道无人时自动离开
});

module.exports = (client) => {
  const targetChannelId = '431197967337390081';
  const prefix = '-';

  client.on('messageCreate', (msg) => {
    // 只处理指定频道的消息
    if (msg.channel.id !== targetChannelId) return;
    // 忽略机器人自身消息
    if (msg.author.bot) return;
    // 检查是否是命令
    if (!msg.content.startsWith(prefix)) return;

    // 正确提取命令和参数
    const [command, ...args] = msg.content.slice(prefix.length).trim().split(/\s+/);
    const url = args.join(' '); // 兼容带空格的链接(YouTube链接一般无空格,但逻辑更健壮)

    if (command === 'play') {
      // 检查用户是否在语音频道
      if (!msg.member.voice.channel) {
        return msg.reply('你得先加入一个语音频道!');
      }
      // 调用DisTube的play方法,自动处理连接和播放
      distube.play(msg.member.voice.channel, url, {
        textChannel: msg.channel, // 指定发送播放通知的文本频道
        member: msg.member,
      });
    }
  });

  // 添加DisTube事件监听,方便排查问题
  distube.on('playSong', (queue, song) => {
    queue.textChannel.send(`开始播放:\`${song.name}\``);
  });

  distube.on('error', (channel, error) => {
    channel.send(`播放出错:${error.message}`);
    console.error(error);
  });
};

额外注意事项:

  • 确保安装了DisTube的必要依赖:npm install distube @discordjs/opus ffmpeg-static(ffmpeg是播放音频的核心依赖)
  • 机器人需要拥有语音频道的Connect和Speak权限
  • 仅支持公开可访问的YouTube链接,私有链接无法播放

内容的提问来源于stack exchange,提问作者folmer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 04:25:39