【问题标题】:How to proxy a media stream in Node?如何在 Node 中代理媒体流?
【发布时间】: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


【解决方案1】:

我找到了解决方案,使用流管道。

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) => {
  req.pipe(request.get(target)).pipe(res);
});

app.listen(PORT);

【讨论】:

  • 如果我想在流式传输之前对音频进行一些处理怎么办?你可能有这个目的的解决方案吗?
  • 是的,我们也可以通过简单的调整来实现这一点,因为我们正在使用可以连接 2 个或更多管道的管道。示例:假设,如果我们想在发回之前压缩目标内容,我们可以修改我们的管道代码,如下所示。 var zlib = require('zlib');var gzip = zlib.createGzip();req.pipe(request.get(target)).pipe(gzip).pipe(res);
  • 如果您需要更多的代理控制权,您可以试试这个NPM Module - Mississippi
猜你喜欢
  • 2018-03-31
  • 2021-04-19
  • 2014-02-05
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
相关资源
最近更新 更多