Discord音乐机器人播放30-50秒后自动停止问题排查
Discord音乐机器人播放中途停止问题解决
你的机器人播放歌曲30-50秒就停止,核心原因是队列的自动断开配置缺失,同时缺少必要的错误监听来排查潜在问题,以下是具体解决方案:
1. 配置队列自动断开规则
创建队列时添加自动断开相关配置,确保播放结束后在语音频道停留指定时间再退出,避免过早断开:
const queue = await player.createQueue(message.guild, { leaveOnEnd: false, // 播放结束后不立即退出 leaveOnEndCooldown: 300000, // 播放结束后停留5分钟(单位:毫秒) leaveOnEmpty: true, // 语音频道为空时退出 leaveOnEmptyCooldown: 300000, // 频道为空后等待5分钟再退出 leaveOnStop: true, // 手动停止播放时退出 leaveOnStopCooldown: 300000 // 停止播放后等待5分钟退出 });
2. 优化队列获取逻辑
避免重复创建队列,优先获取已存在的队列,再创建新队列:
let queue = player.getQueue(message.guild); if (!queue) { queue = await player.createQueue(message.guild, { // 填入上述配置项 }); }
3. 添加队列事件监听
监听曲目播放错误、队列结束等事件,排查是否是播放出错导致中途停止:
在队列创建后添加以下代码:
// 监听曲目播放错误 queue.on('trackError', (queue, track, error) => { console.error(`播放曲目 ${track.title} 出错:`, error); message.channel.send(`播放曲目 ${track.title} 时出现错误,请重试。`); }); // 监听队列结束事件 queue.on('queueEnd', (queue) => { message.channel.send('队列已播放完毕,将在5分钟后退出语音频道。'); });
4. 确认FFmpeg路径配置
确保discord-player能正确找到FFmpeg路径,若系统环境变量未配置FFmpeg,可在player初始化时指定路径(修改../../client/player文件):
const { Player } = require('discord-player'); const player = new Player(client, { ytdlOptions: { quality: 'highestaudio', highWaterMark: 1 << 25 }, ffmpegPath: '你的FFmpeg完整路径' // 例:Windows为'C:/ffmpeg/bin/ffmpeg.exe',Linux为'/usr/bin/ffmpeg' });
修改后的完整play命令代码
const { QueryType } = require("discord-player") const player = require("../../client/player") const Discord = require('discord.js') module.exports = { name: 'play', cooldown: 5, aliases: ['p'], description: "Plays a song", usage: "?p <song/vid-URL>", category: "Music", async execute(client, message, args) { const songTitle = args.join(" ") const nosongEmbed = new Discord.MessageEmbed() .setColor('#3d35cc') .setDescription(`‼️ - Please provide a song URL or song name!`) if (!songTitle) return message.reply({ embeds: [nosongEmbed] }) const novcEmbed = new Discord.MessageEmbed() .setColor('#3d35cc') .setDescription(`‼️ - You have to be in a Voice Channel to use this command!`) if (!message.member.voice.channel) return message.reply({ embeds: [novcEmbed] }) // 优先获取现有队列,不存在则创建 let queue = player.getQueue(message.guild); if (!queue) { queue = await player.createQueue(message.guild, { leaveOnEnd: false, leaveOnEndCooldown: 300000, leaveOnEmpty: true, leaveOnEmptyCooldown: 300000, leaveOnStop: true, leaveOnStopCooldown: 300000 }); } // 添加事件监听 queue.on('trackError', (queue, track, error) => { console.error(`播放曲目 ${track.title} 出错:`, error); message.channel.send(`播放曲目 ${track.title} 时出现错误,请重试。`); }); queue.on('queueEnd', (queue) => { message.channel.send('队列已播放完毕,将在5分钟后退出语音频道。'); }); if (!queue.connection) await queue.connect(message.member.voice.channel) let url = songTitle // 搜索曲目 const result = await player.search(url, { requestedBy: message.author, searchEngine: QueryType.AUTO }) // 无结果则返回 if (result.tracks.length === 0) return message.reply("No results") // 添加到队列 const song = result.tracks[0] await queue.addTrack(song) const embed = new Discord.MessageEmbed() .setColor("AQUA") .setDescription(`**[${song.title}](${song.url})** has been added to the Queue`) .setThumbnail(song.thumbnail) .setFooter({ text: `Duration: ${song.duration}`}) message.reply({ embeds: [embed] }) // 未播放则开始播放 if (!queue.playing) await queue.play() } }
内容的提问来源于stack exchange,提问作者ra1nb0w
相关产品推荐
相关产品推荐

