内部可读和NodeJS可读流
我在从互联网上获取MP4和MP3文件,并将其音频通过Discord.js输入到机器人中时遇到了一些困难,所以我做了一些笔记。两者都是流式(Stream)的形式,但简单来说,它们之间存在着新旧的关系。
内部可阅读的
在Discord.js中使用的是一种新型的Stream。大多数新库似乎更倾向于使用这种类型的Stream。
NodeJS.ReadableStream
NodeJS 可读流
古老的Stream形式。node-fetch返回的body等数据,以某种原因,使用这种格式返回。
相互兼容
互换性不可行。然而,将旧的NodeJS.ReadableStream转换(包装)为新的internal.Readable是可能的(在官方文档内找到这个说明花费了相当长的时间…)。
一个例子是转译(rap)。
我会上传一个基于使用Discord.js创建的Bot的实例,并包含示例代码。
import { Client, Message, VoiceChannel } from 'discord.js';
import fetch from 'node-fetch';
import { Readable } from 'stream';
const client = new Client();
client.on('message', async (message: Message) => {
if (message.author.bot) return;
const voiceChannel = message.member?.voice.channel;
if (message.content === 'play' && voiceChannel) {
musicPlayAndStreamConvert(voiceChannel)
}
});
async function musicPlayAndStreamConvert(voiceChannel: VoiceChannnel) {
const res = await fetch('<mp3 file url>');
const readableStream = new Readable().wrap(res.body);
const connection = await voiceChannnel.join();
const dispatcher = connection.play(readableStream);
this.dispatcher.on('finish', () => {
connection.disconnect();
})
}
void client.login('<bot token>');
結論として
由于对此的理解也很浅薄,所以如果有任何错误的地方,请提出来。
另外,希望有更多不会在遇到同样问题时放弃的人(稍晚的七夕)。