Discord.js 将 mpeg 音频流传输到语音通道

Discord.js stream mpeg audio stream into voice channel

我想从 URL(特别是 https://s1-sjc.liveatc.net/kjfk_atis)不断地将 mpeg 音频流(MIME 类型:audio/mpeg)流式传输到我的 Discord 服务器上的语音通道之一一个机器人。

我正在使用 discord.js nodejs 模块,它以面向对象的方式处理不一致 API。我已经创建了一个机器人帐户并完成了基本的 "Ping!Pong!" 测试以确保我的代码正常工作。

我不知道 mpeg 音频流或 Discord 语音通道 API 是如何工作的,也没有找到有这方面经验的人。

我正在寻求一种廉价的方法,即在文本频道中以纯文本形式简单地回复 URL 给用户。但是我觉得不能接受。

const Discord = require('discord.js');
const client = new Discord.Client();

client.on('ready', () => {
  console.log(`Logged in as ${client.user.tag}!`);
});

client.on('message', msg => {
  if (msg.content === 'ping') {
    msg.reply('Pong!');
  }
});

client.login('heregoesmybottoken');

完成的结果应该连接到语音通道并在启动后从 URL https://s1-sjc.liveatc.net/kjfk_atis 开始 playing/streaming 音频。​​


编辑

对我来说,截断音频流,将其写入磁盘,然后从磁盘读取的解决方案 不可接受 因为这会导致巨大的 I/O 压力。

由于还没有人给出答案,我自己做了一些调查,发现 https://s1-sjc.liveatc.net/kjfk_atis 上用于流式传输音频的技术与视频流的技术不同:它 不是分块,而是一个持续的 HTTPS 请求,其中包含可能是原始 PCM 数据的内容。

const request = require('request');
const fs = require("fs");
request('https://s1-sjc.liveatc.net/kjfk_atis').pipe(fs.createWriteStream('atis.mp3'));

我写了这段代码来下载流,确实 NodeJS 开始 连续写入 atis.mp3 直到我按下 Ctrl+C。该文件确实包含音频,并且可以通过 Windows 媒体播放器打开。

所以现在我只需要找到一种方法将这个流重定向到 discord.js,希望 node-opus 会自动将流转换为正确的格式。

仍然不知道到底发生了什么。但经过多次尝试和错误后,发现这个工作。

var voice, player;

// To join channel
client.channels.get("channelid").join()
    .then((connection) => {voice = connection});

// To stream audio
player = voice.playArbitraryInput("https://s1-sjc.liveatc.net/kjfk_atis");

// To stop
player.end();

我将把它留在这里以备将来参考。随意 post 一些解释。