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

Discord.js技术问题:连接语音频道后如何播放MP3文件

解决方案:Discord.js 连接语音后播放MP3文件

Discord.js v14+ 的语音播放功能依赖独立的 @discordjs/voice 包,你之前的尝试失败大概率是因为缺少依赖或未正确处理播放器/资源的生命周期。

步骤1:安装必要依赖

先在项目根目录执行以下命令安装依赖:

npm install @discordjs/voice ffmpeg-static @discordjs/opus sodium-native
  • @discordjs/voice:核心语音处理模块
  • ffmpeg-static:处理音频编码解码(必须,否则无法加载MP3)
  • @discordjs/opus & sodium-native:提供语音传输的加密和编码支持

步骤2:修改代码实现播放逻辑

以下是整合了MP3播放功能的完整代码,替换你原有的消息监听逻辑即可:

const { Client, Events } = require('discord.js');
// 引入语音相关模块
const { 
  joinVoiceChannel, 
  createAudioPlayer, 
  createAudioResource, 
  VoiceConnectionStatus,
  AudioPlayerStatus
} = require('@discordjs/voice');

client.on(Events.MessageCreate, async message => {
  // 原有的触发条件不变
  if (message.author.id === '111111111111111111' && message.content.slice(-1) === '!') {
    const guild = message.guild;
    let channelToPlayIn;

    // 找到第一个有人的语音频道(优化遍历方式)
    channelToPlayIn = guild.channels.cache.find(channel => 
      channel.type === 2 && channel.members.size > 0
    );

    if (!channelToPlayIn) {
      message.reply('没找到有人的语音频道');
      return;
    }

    // 连接语音频道
    const connection = joinVoiceChannel({
      channelId: channelToPlayIn.id,
      guildId: channelToPlayIn.guild.id,
      adapterCreator: channelToPlayIn.guild.voiceAdapterCreator,
      selfDeaf: false,
    });

    // 监听连接错误
    connection.on(VoiceConnectionStatus.Disconnected, () => {
      connection.destroy();
    });

    // 创建音频播放器
    const player = createAudioPlayer();

    // 订阅播放器到连接
    const subscription = connection.subscribe(player);

    if (!subscription) {
      message.reply('无法订阅音频播放器');
      connection.destroy();
      return;
    }

    // 创建音频资源(替换成你的MP3文件路径,注意相对路径或绝对路径)
    try {
      const resource = createAudioResource('./path/to/your/file.mp3');
      // 开始播放
      player.play(resource);

      // 监听播放结束事件,播放完后断开连接
      player.on(AudioPlayerStatus.Idle, () => {
        subscription.unsubscribe();
        connection.destroy();
        message.reply('播放完毕,已断开语音连接');
      });

      // 监听播放器错误
      player.on('error', error => {
        console.error('播放器错误:', error);
        message.reply('播放音频时出错');
        subscription.unsubscribe();
        connection.destroy();
      });
    } catch (err) {
      console.error('加载音频资源失败:', err);
      message.reply('无法加载指定的MP3文件,请检查路径是否正确');
      connection.destroy();
    }
  }
});

关键注意事项

  • MP3路径问题:确保createAudioResource中的路径正确,相对路径是相对于你的项目根目录,或者使用绝对路径避免错误。
  • FFmpeg必须存在:如果安装ffmpeg-static后仍报错,可能需要手动安装系统级FFmpeg(比如Windows用Chocolatey,Mac用Homebrew)。
  • 生命周期管理:不要用固定的setTimeout销毁连接,应该监听AudioPlayerStatus.Idle事件,等播放结束后再断开,避免音频没播完就被切断。
  • 权限问题:确保机器人有Connect和Speak的语音频道权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:10:29