使用 Node.js 的流式音频,带带宽控制和动态音轨切换

Streaming audio with Node.js with bandwidth control and dynamic track switching

假设我的服务器上有同一首歌曲的不同比特率 mp3。 是否可以让我的节点服务器检测客户端接收块的速度,从而在文件之间动态切换? 例如,服务器收到一个曲目请求,然后开始向客户端流式传输它的 192kbps 版本。在几个块之后,它检测到客户端接收它们的速度不够快,因此将数据源切换到 128 kbps 版本,等等。 目前我只是设法做到这一点作为一个简单的测试,但它根本没有控制选项:

const mediaServer = require('mediaserver');
router.get('/play', function(req, res, next){
    mediaServer.pipe(req, res, appRoot + 'private/media/musica/m.mp3')
});

您描述的方法常用于视频传输 - 通常使用的术语是自适应比特率 (ABR) 流。

ABR 与您描述的内容之间的主要区别在于,下一个块使用哪种比特率的决定是由客户端而不是服务器做出的。

这在实践中效果很好,因为无论如何都是客户端在请求块,而且最好通过检查输入缓冲区来了解它是否可以处理更高的非速率或需要更低的速率例如。

有几种开源 ABR 实现,您可以检查它们以了解它们的工作原理 - 如前所述,大多数都以视频为中心,并且由于与视频相比音频通常非常小,您可能会发现它们不使用 ABR对于音频,但原理是一样的。

可能对您来说最容易看的是 video.js 和 dash.js:

特别是如果您查看 dash.js 中的 ABR 规则(破折号。js/src/streaming/rules/abr/ 在撰写本文时),它有助于快速了解他们是如何实施的 - 有相当多的经验和逻辑,因此您可能会发现最容易利用像这样令人兴奋的东西。