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

时间:2019-10-23 11:02:24

标签: javascript node.js discord.js audio-streaming mpeg

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

我正在使用discord.js nodejs模块,该模块以面向对象的方式处理discord 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开始播放/流式传输音频。


编辑

对我来说,截断音频流,将其写入磁盘,然后从磁盘中读取的解决方案不可接受,因为这会导致大量的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 Media Player打开。

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

1 个答案:

答案 0 :(得分:0)

仍然不知道到底发生了什么。但是经过多次尝试和错误后,发现这样做确实可行。

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();

我将把它留在这里以备将来参考。随时发表一些解释。