如何使用 YTDL 和 discordjs/voice 包流式传输音乐。 DiscordJS

How can I stream music using YTDL and discordjs/voice package. DiscordJS

我使用的是最新版本的 discord,他们删除了语音的内置库 API。我想出了如何加入频道的方法,但我已经尝试了很多次尝试在该频道上播放音乐。

我想使用 yt-dl 下载文件,discordjs/voice 连接和播放。

感谢所有帮助过我的人。

Discord.js V13 和@discordjs/voice

自从对 Discord.js 库进行了相对较新的更新后,您在 Discord 语音频道中通过客户端播放音频文件或流的方式发生了很多变化。 Discord 有一个非常有用的指南,可以在基本级别 right here 向您解释很多事情,但我将把它压缩一点,并向您解释如何让它发挥作用。

一些先决条件

重要的是要注意,对于与您的机器人的语音通道有关的任何事情,都必须在您的客户端中具有 GUILD_VOICE_STATES 意图。没有它,您的机器人实际上将无法连接到语音通道,即使它看起来是这样。如果您还不知道什么是意图,here 是同一指南中的相关页面。

此外,您还需要一些额外的库来帮助您处理和流式传输音频文件。这些东西会在后台做很多你不需要担心的事情,但如果没有它们,任何音频都无法播放。要找出您需要什么,您可以使用 @discordjs/voice 中的 generateDependecyReport() 函数。 Here 是解释如何使用它以及您需要哪些依赖项的页面。要使用该函数,您必须从 @discordjs/voice 库中导入它。

正在通过客户端播放音频

因此,一旦一切设置完毕,您就可以了解如何播放音频和音乐了。这是从 ytdl-core 包获取流开始的几个步骤过程。一旦你有了这个流,你需要制作一个 AudioPlayer 并给它一个 AudioResource,它是用你得到的流构建的。这可能看起来有点复杂,但让我们分解一下。

ytdl-核心

从这个包中获取流实际上相当简单,您只需要 url 您想要流式传输的 YouTube 视频并按以下方式使用它:

const stream = ytdl(url, { filter: 'audioonly' })

这使得来自 YouTube 的可读流和过滤器使您不会浪费资源来获取视频,因为您只需要音频。

音频播放器

AudioPlayer 本质上是您的自动点唱机。您可以通过简单地调用其函数并将其存储在 const 中来创建一个,如下所示:

const player = createAudioPlayer()

这是 @discordjs/voice 库中的一个函数,必须像 generateDependencyReport() 一样导入。 你可以给它一些参数来修改它的行为,但现在这并不重要。您可以在 Discord 指南右侧 here.

的页面上阅读更多相关信息

音频资源

要让您的 AudioPlayer 真正播放任何内容,您必须创建一个 AudioResource。这基本上是您的文件或流的一个版本,经过修改以与播放器一起使用。使用 @discord.js/voice 库中名为 createAudioResource(...) 的另一个函数可以非常简单地完成此操作。这必须再次导入。作为参数,您可以解析 mp3 或 webm 文件的位置,但您也可以像已经获取的那样使用流对象。只需输入 stream 作为该函数的参数。

现在播放资源还有两个步骤。首先,您必须订阅与播放器的连接。这基本上告诉连接广播您的 AudioPlayer 正在播放的任何内容。要做到这一点,只需在 connection 对象上调用 .subscribe() 函数,您可以从用于加入频道的 joinVoiceChannel() 函数中获得该函数,播放器作为参数,如下所示:

const connection = joinVoiceChannel({
    channelId: channel.id,
    guildId: channel.guild.id,
    adapterCreator: channel.guild.voiceAdapterCreator,
})
connection.subscribe(player)

player.play(resource)

您在上面看到的第二行代码是如何让您的播放器播放您的 AudioResource。只需将资源解析为参数即可开始播放。您可以在 Discord 指南右侧 here.

的页面上找到更多关于 AudioResource 方面的内容

这种方式比在 V12 中需要更多的步骤,但是一旦你掌握了这个系统,它真的没有那么糟糕或困难。