如何实现Discord Bot播放指定YouTube URL?输入s1指令自动加入语音频道播放
实现s1指令自动加入语音频道播放指定YouTube链接的修正方案
现有代码无法正常运行的核心原因有两点,都是Discord Bot语音功能开发里的高频问题:
- Discord.js 原生的play方法不支持直接传入YouTube链接作为播放源,早期版本的写法现在已经完全失效,必须额外通过音频流拉取工具拿到可解码的音频流,再传递给语音连接使用
- 代码的交互时序存在偏差,当前写的
message.reply("done")会在Bot刚加入频道时就立刻触发,并非等音频播放完成后才发送提示
调整后的可运行代码逻辑
首先需要提前安装好基础依赖:负责音频编码的opus组件、负责语音通道加密的sodium组件、负责拉取YouTube音频流的ytdl-core,这三类组件是语音播放功能的必备依赖,缺任意一个都无法正常运行。
核心指令部分的修正代码:
// 依赖引入需写在代码文件的最头部 const ytdl = require('ytdl-core'); if (message.content == "s1") { // 校验用户是否处于语音频道 if (!message.member.voice.channel) return message.reply("你需要先加入一个语音频道才能使用该指令"); // 替换为你要固定播放的YouTube链接 const targetPlayUrl = "https://youtu.be/~~~~"; message.member.voice.channel.join() .then(voiceConnection => { // 拉取纯音频流,跳过视频冗余数据 const audioStream = ytdl(targetPlayUrl, { filter: 'audioonly', quality: 'highestaudio' }); const audioDispatcher = voiceConnection.play(audioStream); // 音频播放完成后的退出逻辑 audioDispatcher.on('finish', () => { voiceConnection.disconnect(); message.reply("指定音频播放完毕,已退出语音频道"); }); // 播放开始的提示,在Bot成功加入频道后触发 message.reply("已加入频道开始播放"); }) .catch(err => console.log("语音连接异常:", err)) }
额外注意的易踩坑项
- 如果使用的是Discord.js v14及以上的新版本,旧的
channel.join()方法已经被移除,需要替换为官方新的语音模块调用逻辑,直接照搬旧教程的join方法会直接报语法错误 - 如果Bot成功进入频道但完全没有声音,优先检查是否安装了opus编码组件,这是语音播放的硬性依赖,没有安装的话哪怕代码逻辑完全正确也无法出声
内容的提问来源于stack exchange,提问作者ivFiz
相关产品推荐
相关产品推荐

