首页 > 解决方案 > 未接收到数据时向 Node.js 流添加“静默帧”

问题描述

我正在使用 Node.js 创建一个 Discord.js 机器人,它在语音通道中记录用户的音频。它加入一个频道并开始分别收听每个用户。它记录到一个 .pcm 文件(所以只有原始数据)。

现在,这可行,但是 Discord 的音频流的性质导致了一个问题。从 Discord 的 API 获得的音频流仅在特定用户说话时发送数据,而不是在他们沉默时发送数据。这导致用户说话的时刻被一个接一个地粘贴,中间没有沉默。

例如,我说话 5 秒钟,然后停止说话 5 秒钟,然后再开始说话,依此类推。如果我这样做 1 分钟,我将得到一个只有 30 秒长的文件,因为 5 秒的静音没有记录在流中。

代码看起来像这样(receiver这是 Discord API 为语音连接提供的,当我发出命令时流任意结束):

const audioStream = receiver.createStream(user, {mode:'pcm', end:'manual'};
const outputStream = fs.createWriteStream('SOME_PATH');

audioStream.pipe(outputStream);

audioStream.on('end', () => {
    console.log('Ended stream')
});

audioStream输出是 16 位 little-endian 44100 Hz 流(因此仅在用户讲话时)。

有没有办法可以用某种无声帧填补数据空白?或者也许保持静默流运行,只在数据进来时才输入数据?

标签: node.jsdiscord.jsfspcmcreatewritestream

解决方案


您是否尝试过将WritableStream一起使用?

它来自 discord.js 语音库,静音帧声明为:

const SILENCE_FRAME = Buffer.from([0xf8, 0xff, 0xfe]);

推荐阅读