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

如何使用FFmpeg和discord.js v12让Discord机器人在语音频道播放音频

Discord.js v12 语音播放问题解答

核心疑问解答

  1. dispatcher 实例和 connection.play() 方法都属于discord.js v12内置的语音模块,无需额外引入第三方核心库即可调用。
  2. FFmpeg不需要在代码中手动引入,只要你已在本地环境正确安装FFmpeg,且已将其添加到系统环境变量中可全局调用,discord.js会自动调用它处理音频流。
  3. @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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:45:03