You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Discord.js技术问题:Audio Resource无法播放且无任何报错

解决Discord机器人显示正在播放但无音频输出的问题

你遇到的情况很典型——机器人成功进入语音频道、显示播放状态,但实际没有音频输出,还没报错,这大多是因为音频播放器没和语音连接绑定,导致音频没法传输到频道里。咱们一步步来修复你的代码:

核心问题分析

  • 缺失播放器与语音连接的绑定:你创建了player并加载了音频资源,但没把播放器附加到语音连接上,Discord.js Voice根本不知道该把音频发到哪个频道。
  • 模块导入位置不合理:在execute函数内部重复导入@discordjs/voice模块,可能会引发加载冲突或初始化问题,建议移到文件顶部统一导入。
  • 未正确处理语音连接对象vc.join()返回的VoiceConnection对象是关键,你需要保存它并用来订阅播放器。

修正后的完整代码

// 把模块导入移到文件顶部,避免重复加载
const { createAudioPlayer, NoSubscriberBehavior, createAudioResource, joinVoiceChannel } = require('@discordjs/voice');

module.exports = { 
  name: 'play', 
  description: 'gets bots playing thing', 
  async execute(client, message, args, discord){ 
    // 检查用户是否在语音频道
    const vc = message.member.voice.channel; 
    if(!vc) return message.reply('You must be in a voice channel to play music!'); 

    // 按Discord.js Voice标准方式加入语音频道,传递必要参数
    const connection = joinVoiceChannel({
      channelId: vc.id,
      guildId: vc.guild.id,
      adapterCreator: vc.guild.voiceAdapterCreator,
    });

    // 创建音频播放器
    const player = createAudioPlayer({ 
      behaviors: { 
        noSubscriber: NoSubscriberBehavior.Pause, 
      }, 
    });

    // 创建音频资源,注意路径要匹配你的项目结构(建议用绝对路径或path模块处理)
    const resource = createAudioResource('../audio/sound.mp3'); 

    // 关键步骤:将播放器订阅到语音连接,让音频能传输到频道
    const subscription = connection.subscribe(player);

    // 开始播放音频
    player.play(resource); 

    // 错误处理逻辑
    player.on('error', error => { 
      console.error(`Error: ${error.message} with resource`); 
      // 这里需要你自己实现getNextResource()逻辑,或者根据需求调整错误处理
      // player.play(getNextResource()); 
    }); 

    // 可选:监听播放器状态,闲置时自动取消订阅、清理资源
    if (subscription) {
      player.on('stateChange', (oldState, newState) => {
        if (newState.status === 'idle') {
          subscription.unsubscribe();
          // 可选:播放结束后自动断开语音连接
          // connection.destroy();
        }
      });
    }
  } 
}

关键改动说明

  1. 统一模块导入:把@discordjs/voice的所有依赖移到文件顶部,避免函数内重复加载,提升代码稳定性。
  2. 标准语音连接方式:用joinVoiceChannel替代旧的vc.join(),传递频道ID、服务器ID和适配器创建器,确保连接初始化正确。
  3. 绑定播放器与连接connection.subscribe(player)是让音频输出的核心操作——之前的代码完全漏掉了这一步,这就是机器人显示播放却没声音的主要原因。
  4. 路径提示:确认../audio/sound.mp3的相对路径正确,如果路径错误,资源会加载失败但可能不会抛出明显报错,建议用path.resolve(__dirname, '../audio/sound.mp3')生成绝对路径,避免路径问题。
  5. 资源清理:添加了播放器状态监听,闲置时自动取消订阅,避免资源泄漏。

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

火山引擎 最新活动