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

时间:2014-01-19 09:19:06

标签: algorithm node.js buffer audio-streaming

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

缓冲需要预测,但"Prediction is very difficult, especially if it's about the future"。 : - )

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

有很多方案试图训练到完美的尺寸,但是你的本地wifi和网站播放的可靠性使得一个通用的算法变得困难。人们会指向YouTube,Netflix,Hulu等 - 但这些并不存在,因此这是一个不同的问题。 Twitch.tv有实时内容,启动时会有缓冲延迟。