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

标签 algorithm node.js buffer audio-streaming

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

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

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

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

我四处搜索,找到了一些关于 DSP 帧大小等的白皮书,但来自这里社区的建议会很棒。

最佳答案

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

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

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

关于使用 node.js 进行缓冲音频播放的算法/技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21215016/

相关文章:

Java:从 FloatBuffer 到 OpenGL - wrap() vs. allocate() vs. BufferUtils.createBuffer()

Android MediaPlayer 在 API 21 上失败(但不是 API 19 或 22!)

c - 超时从串口读取可变长度数据

arrays - 当 A 和 B 排序时找到最小的 A[i]^2 + B[i]^2

c++ - 全景影像摄影测量: How to calculate range?

javascript - 简单的 node.js 服务器返回成功或错误

javascript - 如何从后端获取数据,并在浏览器端使用它?

algorithm - 删除作为子集的集合

image - 在灰度图像中找到十字的算法

mysql - 我还需要在nodejs中使用 'select ... for update'吗?