如何使用djs v13在Discord舞台频道播放本地音乐文件
Discord.js v13.2.0 舞台频道播放本地音频无声音修复方案
核心问题排查
你的代码存在4处导致无声音的关键问题:
path.join()参数填写错误,且未基于脚本目录定位文件,大概率无法找到目标音频- 没有将音频播放器订阅到语音连接实例,播放器输出的流没有送入语音频道
- 未指定音频流类型,底层可能无法正确解码本地MP3文件
- 仅提交发言请求未确认权限生效,舞台频道发言权限未正确获取
修复后可用代码
const { createReadStream } = require('fs'); const { join } = require('path'); const { createAudioResource, StreamType, createAudioPlayer, joinVoiceChannel, entersState, VoiceConnectionStatus } = require('@discordjs/voice'); // 建立语音连接 const connection = joinVoiceChannel({ channelId: message.member.voice.channel.id, guildId: message.guild.id, adapterCreator: message.guild.voiceAdapterCreator }); // 等待连接就绪,避免状态未同步导致播放失败 try { await entersState(connection, VoiceConnectionStatus.Ready, 20000); } catch (err) { connection.destroy(); console.error('语音连接超时:', err); return; } // 优先直接获取舞台频道发言权限,权限不足时再提交发言申请 await message.guild.me.voice.setSuppressed(false) .catch(() => message.guild.me.voice.setRequestToSpeak(true)); // 正确拼接音频路径,__dirname为当前脚本所在目录,可根据实际存储位置调整 const audioPath = join(__dirname, '../music/audio.mp3'); // 包装本地文件流,指定流类型确保解码正常 const resource = createAudioResource(createReadStream(audioPath), { inputType: StreamType.Arbitrary }); const player = createAudioPlayer(); // *核心步骤*:将播放器输出流绑定到语音连接 connection.subscribe(player); // 播放音频并添加错误监听 player.play(resource); player.on('error', err => console.error('播放出错:', err));
额外注意事项
- 确认
@discordjs/voice版本与discord.js v13.2.0兼容,依赖版本不匹配会导致流传输异常 - 确认机器人在对应服务器有
连接、说话权限,舞台频道额外需要请求发言或优先发言权限 - 执行代码时可打印
audioPath变量,核对路径是否指向真实存在的MP3文件 - 若仍无声音,可安装
ffmpeg-static依赖,让库自动转码不兼容的音频格式
内容的提问来源于stack exchange,提问作者MegaMix_Craft
相关产品推荐
相关产品推荐

