首页 > 解决方案 > 如何在 Node JS 中将原始 PCM 流转换为 Discord 机器人的 opus 或 wav 流?

问题描述

背景:

我正在为Discord创建一个个人音乐机器人,主要使用discord.js,我想添加的功能之一是让机器人直接从Voicemeeter播放音频。这个解决方案是最佳的,因为机器人能够以比 Discord 用户更好的质量进行流式传输,并且它们能够播放立体声而不是单声道,而且我可以选择使用 Voicemeeter 流式传输的源。

Voicemeeter 带有一个称为 VBAN 的功能,它允许您使用VBAN 协议通过网络将音频数据发送到另一台运行 VBAN 接收器的计算机。

Jacob Bower 在 Node JS 中制作了一个VBAN 接收器脚本,该脚本获取原始 PCM 音频数据并使用 node-speaker 通过扬声器播放。

问题:

使用 Jacob 的脚本,如果您尝试将 PCM 音频直接通过管道传输到 Discord 机器人,则会出现错误“错误 [VOICE_PLAY_INTERFACE_BAD_TYPE]:未知流类型。” 我相信这是因为从脚本接收到的 PCM 音频包含在缓冲区中,discord bot 无法在本地播放。我需要找到一种方法以可读格式获取该 PCM 音频,以便不和谐机器人播放。(我认为可读格式包括 opus 和 wav,(可能还有其他不是 PCM 的流媒体格式))

我试过的:

const { OpusEncoder } = require('@discordjs/opus');
const { PassThrough } = require('stream');
const EncodedStream = new PassThrough();
const encoder = new OpusEncoder(48000, 2); //48000 hz, 2 channels

. . .

if (data.header.sp == 0) { //This code executes each time there is a new frame sent from VBAN
     EncodedStream.write(encoder.encode(data.audio));
}

. . .

connection.play(EncodedStream); //Connection is just the Bot being inside a voice channel.

遇到了错误"Cannot create a Buffer larger than 0xffffffff bytes.",我不确定为什么会出现该错误,因为在每个缓冲区上运行 Buffer.byteLength 会产生 1024。


我现在正在努力解决这个问题,任何帮助我指向正确方向的帮助将不胜感激。

标签: node.jsaudiodiscord.jspcmopus

解决方案


推荐阅读