我正在使用 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')
});
The audioStream
输出是 16 位小端 44100 Hz 流(因此仅当用户说话时)。
有没有办法可以用某种静默帧来填补数据空白?或者也许保持静默流运行并仅在数据进入时才将其放入?
The @discord.js/语音 https://github.com/discordjs/voice/blob/408999d78962b860f3dd712716c8c76e4464dc37/src/audio/AudioPlayer.ts#L10库将静音帧声明为:
const SILENCE_FRAME = Buffer.from([0xf8, 0xff, 0xfe]);
您是否尝试过将其与可写流 https://nodejs.org/dist/latest-v16.x/docs/api/stream.html#stream_class_stream_writable?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)