Android中的音频缓冲

时间:2014-10-08 22:00:17

标签: java android audio buffering mediacodec

我正在尝试为无线电流传输实现高效的音频缓冲。最初我尝试按照以下Program Flow

进行缓冲

所以最初我的InputStream取自HttpUrlConnection。通过填充缓冲区的循环缓冲区从输入流中读取数据。在这种情况下,我有3个缓冲区,但缓冲区的数量和大小可以很容易地改变。所以在填满所有缓冲区后,我开始将第一个缓冲区中的数据写入连接到OutputStream的{​​{1}},所以每当我向InputStream写入内容时,都可以读取来自OutputStreamInputStream负责从MediaCodec读取数据并解码然后传递给InputStream的数据。

这个设置的问题是,一段时间后OutputStream最终到达循环缓冲区的末尾,因此AudioTrack"OutputStream.giveMeNextBufferWithData"之间不再有“额外缓冲区”(伪代码)。

我已经尝试增加每个缓冲区的数量和大小,但这没有帮助。它只会延迟"CircularBuffer.readDataFromInputStreamAndCreateBuffer"“渴望”更多数据之前的时间。

有一个非常好的库https://code.google.com/p/aacdecoder-android/在缓冲音频方面非常有效,但不幸的是我无法弄清楚缓冲是如何在那里完成的,在某些情况下它不能很好地工作

对于这样的任务,还有任何“完美”的算法吗?我正在考虑双重/三重缓冲,但我不太确定它并考虑到我一直在网上搜索并实施不同的解决方案,但最后几天没有成功,我最终决定问她。

我希望我能很好地解释一切。

提前谢谢大家!

1 个答案:

答案 0 :(得分:0)

缓冲本身最终不足以用于固定速率广播(按需点播)流源,您无法保证源和设备采样率完全相同。

对于短节目,您可以做的是缓冲一两个音频,如果您的播放速度很快,您将开始进入该保留,但希望不会超过它。同样,如果播放数据的速度比生成速度慢,则需要多余的缓冲区容量。但是当采样率差累积到缓冲储备大小以上时,这些最终会失败。

相反,流式传输工作" eternally"你需要一种方法来平衡生产和消费率。

A"懒惰"这样做的方法是使用逻辑,每隔一段时间增加或减少一个样本,具体取决于错误趋势的方向。但这在技术上引入了失真。

"花式"这样做的方法是使用一个可变的采样率转换器,其比率可以随时间调整,以抵消音频消耗率和生产率之间的误差。