使用node.js进行缓冲音频回放的算法/技术

Roh*_*har 5 algorithm buffer audio-streaming node.js

我正在使用node.js来播放来自网络的音频流,例如广播电台或mp3流.数据流如下:

电台(mp3音频) - >我的node.js脚本 - >蹩脚的mp3解码器(node-lame) - > PCM输出到声卡(节点 - 声音).

问题是由于网络延迟,播放有时会被破坏.所以我所做的是将所有数据块缓冲到一个变量中.一旦变量大小达到(1Mb)左右,我就开始从变量而不是流直接播放声音.解决了破碎的播放问题.

我的问题是 - 我可能不需要等到缓冲区大小达到1Mb.我确定有一种算法或一些计算来检测平均网络速度或延迟,并确定不间断播放的最佳缓冲区大小.当然,我可以通过试验和错误提出一些草率的解决方案,但我想知道是否有任何算法或技术可以实现我想要完成的任务?

我搜索了一些关于DSP等帧大小的白皮书,但是社区的建议很棒.

jim*_*101 2

缓冲需要预测,但“预测是非常困难的,尤其是关于未来的预测”。:-)

如果您正在做一些简单的事情,则缓冲区大小决定了从您点击播放到听到音频的延迟。如果作为用户,您可以容忍较长的延迟,请相应地设置较大的缓冲区。如果没有,许多更好的缓冲算法(可能包括手机的语音通道)会改变播放速率,以比标称速率稍慢的速度播放音频,直到建立一个大的缓冲区。如果您对音频硬件有这种控制,那么这是最好的解决方案 - 您可以慢慢建立几 MB 的缓冲区,而不会影响从单击播放到听到音频的延迟。用户通常不会注意到适度的速率变化——大多数美国无线电台都会将歌曲播放速度提高 2% 以上,以适应更多的广告,但几乎没有人注意到。在 5% 时,很多人确实注意到了。在一定的缓冲区大小下,您可以返回到标称速率,并享受不间断的播放。

有许多方案试图训练到完美的尺寸,但本地 WiFi 以及站点播放的可靠性使得一刀切的算法变得困难。人们会指向 YouTube、Netflix、Hulu 等,但这些都不是直播,所以这是一个不同的问题。Twitch.tv 有实时内容,并且启动时存在缓冲延迟。