如何使用FFmpeg和discord.js v12让Discord机器人在语音频道播放音频
Discord.js v12 语音播放问题解答
核心疑问解答
dispatcher实例和connection.play()方法都属于discord.js v12内置的语音模块,无需额外引入第三方核心库即可调用。- FFmpeg不需要在代码中手动引入,只要你已在本地环境正确安装FFmpeg,且已将其添加到系统环境变量中可全局调用,discord.js会自动调用它处理音频流。
- @discordjs/opus同样不需要手动在代码中导入调用,只要你已在项目中完成安装,discord.js的语音模块会自动识别并调用该库完成音频编码工作。
代码问题修复建议
- 确认
connection对象有效性:必须确保已经成功加入目标语音频道、拿到有效的VoiceConnection实例后再调用play方法,否则会直接报错。可以在调用play前增加console.log(connection)校验实例是否存在、是否为有效值。 - 修正音频路径寻址问题:当前拼接的
pathMusic容易出现相对路径寻址错误,建议使用node内置的path模块处理路径,需要先在文件头部引入path模块:const path = require('path'),路径拼接改为const pathMusic = path.resolve(__dirname, musicTitle + '.mp3')。 - 删除未定义变量调用:你在
dispatcher的start事件中打印了未定义的musicurl变量,这会直接触发运行时报错,可以删除该打印语句,或者提前正确定义musicurl变量。 - 删除重复消息发送逻辑:你在
play调用后和start事件中重复发送了播放提醒消息,建议删除play调用后的发送语句,仅保留事件触发后的发送逻辑,避免还未成功加载音频就提前发送播放通知。
修正后代码参考
const path = require('path'); // 前面省略加入语音频道、获取connection实例的逻辑 const pathMusic = path.resolve(__dirname, musicTitle + '.mp3'); const dispatcher = connection.play(pathMusic); dispatcher.on('start', () => { console.log(musicTitle + ' is now playing!'); msg.channel.send('Now playing: ' + musicTitle); }); dispatcher.on('finish', () => { console.log(musicTitle + ' has finished playing!'); }); dispatcher.on('error', console.error);
如果调整后仍然报错,可以查看dispatcher的error事件输出的具体错误信息,常见报错原因基本为音频文件不存在、FFmpeg环境配置错误、语音连接中断三类。
内容的提问来源于stack exchange,提问作者kdg
相关产品推荐
相关产品推荐

