我想使用机器人将来自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能够自动将流转换为正确的格式。
答案 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();
我将把它留在这里以备将来参考。随时发表一些解释。