node.js - 未接收到数据时向 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 流(因此仅在用户讲话时)。
有没有办法可以用某种无声帧填补数据空白?或者也许保持静默流运行,只在数据进来时才输入数据?
解决方案
您是否尝试过将其与WritableStream一起使用?
它来自 discord.js 语音库,静音帧声明为:
const SILENCE_FRAME = Buffer.from([0xf8, 0xff, 0xfe]);
推荐阅读
- c# - 调用异步单行 lambda 委托
- jupyter-notebook - 是否可以在 Jupyter Notebook 中缩放粘贴的图像?
- perl - 使用 HTML::PullParser 获取属性值
- javascript - 为什么在使用 reactjs 挂钩时出现“TypeError:react__WEBPACK_IMPORTED_MODULE_1___default.a.useState 不是函数”错误?
- scala - Gatling scala 扩展失败,找不到证据参数的隐式值
- android - 浮动按钮更改属性 app:maxImageSize frome 代码
- vuejs2 - VueJS 兄弟组件重载挑战
- python - 在嵌入在 tkinter 中的两个 matplotlib 图之间切换时,第一个图上会出现一组额外的意外 x 和 y 轴标签和刻度
- mysql - 如果在第二个表中满足要求,则从多个表中选择数据
- python - 构造 1 到 n 的四元组所有可能组合的最有效方法