【发布时间】:2018-04-04 14:47:25
【问题描述】:
我希望能够将远程 icecast 流代理到客户端。过去几天我一直在摆弄很多东西,但无济于事。
用例:
能够从<audio> 标记src 中提取分析器数据,而不会遇到CORS 问题。
到目前为止我的解决方案
为了解决阻止我直接从<audio> 的源中创建杠杆声音数据的 CORS 问题,我尝试编写一个微型代理,它将请求通过管道传输到特定流并返回任何静态数据其他情况。
这是我的代码:
require('dotenv').config();
const http = require('http');
const express = require('express');
const app = express();
const PORT = process.env.PORT || 4000;
let target = 'http://direct.fipradio.fr/live/fip-midfi.mp3';
// figure out 'real' target if the server returns a 302 (redirect)
http.get(target, resp => {
if(resp.statusCode == 302) {
target = resp.headers.location;
}
});
app.use(express.static('dist'));
app.get('/api', (req, res) => {
http.get(target, audioFile => {
res.set(audioFile.headers);
audioFile.addListener('data', (chunk) => {
res.write(chunk);
});
audioFile.addListener('end', () => {
res.end();
});
}).on('error', err => {
console.error(err);
});
});
app.listen(PORT);
问题
客户端收到来自代理的响应,但这会停止到 60kb 的数据,并且没有收到后续块,尽管代理已收到:
欢迎提出任何建议!
【问题讨论】:
-
HTTP 代理实际上相当复杂。我建议简单地使用 Nginx 或类似的。如果您需要在 Node.js 中执行此操作,可以使用 NPM 包进行代理。至少,您可以将上游响应直接传递给客户端响应......它们是流。你现在所做的没有流量控制,也没有正确处理错误。
标签: node.js proxy stream audio-streaming icecast