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

Posted

技术标签:

【中文标题】如何使用 YTDL 和 discordjs/voice 包流式传输音乐。不和谐JS【英文标题】:How can I stream music using YTDL and discordjs/voice package. DiscordJS 【发布时间】:2021-11-21 08:28:23 【问题描述】:

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

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

感谢任何帮助我的人。

【问题讨论】:

【参考方案1】:

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 核心

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

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 指南的页面上找到更多有关 AudioResource 方面的信息,右侧为 here。

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

【讨论】:

谢谢,但有没有办法检测音乐是否停止? (因为它刚刚结束) @ProfitableMoon 是的,您可以为 AudioPlayer 创建一个侦听器,该侦听器在到达空闲状态时触发代码。这是 AudioResource 结束时的状态。 player.on(AudioPlayerStates.Idle, () => /*Your code here*/). @ProfitableMoon 另外,听起来我能够回答您的问题。您能否通过按我帖子旁边的复选标记将我的帖子标记为已接受的答案?谢谢。 谢谢,是的,我会是新来的。 @ProfitableMoon 没问题,谢谢你,祝你的机器人好运。

以上是关于如何使用 YTDL 和 discordjs/voice 包流式传输音乐。不和谐JS的主要内容,如果未能解决你的问题,请参考以下文章

我在 ytdl-core 包上收到 404 错误

Discord bot 无法使用 ytdl-core 播放歌曲

我正在将 ytdl-core 用于音乐机器人,它一直输出未定义播放

ytdl-core - 将视频标题存储在变量中

Discord.py ytdl 不播放有年龄限制的视频

NodeJS - 如何使 forEach 和 for 循环函数顺序