内部可读和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>');

結論として

由于对此的理解也很浅薄,所以如果有任何错误的地方,请提出来。

另外,希望有更多不会在遇到同样问题时放弃的人(稍晚的七夕)。

广告
将在 10 秒后关闭
bannerAds