Discord音乐bot调用player.stop()无法停止播放故障咨询
问题根因
- 每次执行
play命令都会新建一个独立的AudioPlayer实例,你调用stop时操作的是本次新建的空实例,不是之前正在播放音乐的实例,自然无法终止正在播放的音频 - stop逻辑中添加了
AudioPlayerStatus.Playing事件监听才执行停止,你本次新建的player从未进入播放状态,这段停止逻辑永远不会触发 - 执行
play stop时,代码会先执行ytdl('stop'),参数不是合法URL会直接抛出未捕获错误,后续stop逻辑根本不会执行
修复方案
- 将播放实例全局挂载,不要每次命令执行都新建:可以把player、connection这些实例挂载到Discord客户端对象上,或者全局变量里,保证每次操作的是同一个实例
- 调整代码执行顺序:先判断参数是否为
stop,命中后直接操作已存在的播放实例终止播放,不要执行后续ytdl相关逻辑 - 移除不必要的播放状态监听,调用stop前判断实例是否存在即可
修改后参考代码
const ytdl = require('ytdl-core'); const { joinVoiceChannel, createAudioPlayer, createAudioResource, AudioPlayerStatus } = require('@discordjs/voice'); // 全局存储播放实例,避免每次新建 let globalPlayer = null; let globalConnection = null; module.exports ={ name:'play', description:'播放音乐/停止播放', async execute(message, args, Discord){ // 先处理stop命令,优先级最高 if (args[0] === 'stop') { if (globalPlayer) { globalPlayer.stop(); globalPlayer = null; } if (globalConnection) { globalConnection.destroy(); globalConnection = null; } return message.channel.send('已停止播放'); } // 处理空参数情况 if(!args[0]){ const embed = new Discord.MessageEmbed() .setColor('#0000FF') .setTitle('Da me chevvoi, te posso canta na canzone') return message.channel.send({ embeds: [embed] }); } // 校验URL合法性 if(!ytdl.validateURL(args[0])){ return message.channel.send('请输入合法的YouTube链接'); } try { const stream = ytdl(args[0], {filter: 'audioonly', quality:'highestaudio', highWaterMark: 1<<25 }); const resource = createAudioResource(stream); // 不存在实例时新建 if (!globalPlayer) { globalPlayer = createAudioPlayer(); } if (!globalConnection) { globalConnection = joinVoiceChannel({ channelId: message.member.voice.channel.id, guildId: message.guild.id, adapterCreator: message.guild.voiceAdapterCreator }) globalConnection.subscribe(globalPlayer); } globalPlayer.play(resource); } catch (err) { console.error('播放出错:', err); message.channel.send('播放失败,请稍后重试'); } const {generateDependencyReport} = require('@discordjs/voice'); console.log(args[0]); console.log(generateDependencyReport()); } }
内容的提问来源于stack exchange,提问作者Gio23
相关产品推荐
相关产品推荐

