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
相关产品推荐
相关产品推荐

