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

Discord音乐bot调用player.stop()无法停止播放故障咨询

问题根因
  • 每次执行play命令都会新建一个独立的AudioPlayer实例,你调用stop时操作的是本次新建的空实例,不是之前正在播放音乐的实例,自然无法终止正在播放的音频
  • stop逻辑中添加了AudioPlayerStatus.Playing事件监听才执行停止,你本次新建的player从未进入播放状态,这段停止逻辑永远不会触发
  • 执行play stop时,代码会先执行ytdl('stop'),参数不是合法URL会直接抛出未捕获错误,后续stop逻辑根本不会执行
修复方案
  1. 将播放实例全局挂载,不要每次命令执行都新建:可以把player、connection这些实例挂载到Discord客户端对象上,或者全局变量里,保证每次操作的是同一个实例
  2. 调整代码执行顺序:先判断参数是否为stop,命中后直接操作已存在的播放实例终止播放,不要执行后续ytdl相关逻辑
  3. 移除不必要的播放状态监听,调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:24:02