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 一些解释。
我想从 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 一些解释。