我正在尝试为无线电流传输实现高效的音频缓冲。最初我尝试按照以下
进行缓冲所以最初我的InputStream
取自HttpUrlConnection
。通过填充缓冲区的循环缓冲区从输入流中读取数据。在这种情况下,我有3个缓冲区,但缓冲区的数量和大小可以很容易地改变。所以在填满所有缓冲区后,我开始将第一个缓冲区中的数据写入连接到OutputStream
的{{1}},所以每当我向InputStream
写入内容时,都可以读取来自OutputStream
。 InputStream
负责从MediaCodec
读取数据并解码然后传递给InputStream
的数据。
这个设置的问题是,一段时间后OutputStream最终到达循环缓冲区的末尾,因此AudioTrack
和"OutputStream.giveMeNextBufferWithData"
之间不再有“额外缓冲区”(伪代码)。
我已经尝试增加每个缓冲区的数量和大小,但这没有帮助。它只会延迟"CircularBuffer.readDataFromInputStreamAndCreateBuffer"
“渴望”更多数据之前的时间。
有一个非常好的库https://code.google.com/p/aacdecoder-android/在缓冲音频方面非常有效,但不幸的是我无法弄清楚缓冲是如何在那里完成的,在某些情况下它不能很好地工作
对于这样的任务,还有任何“完美”的算法吗?我正在考虑双重/三重缓冲,但我不太确定它并考虑到我一直在网上搜索并实施不同的解决方案,但最后几天没有成功,我最终决定问她。
我希望我能很好地解释一切。
提前谢谢大家!
答案 0 :(得分:0)
缓冲本身最终不足以用于固定速率广播(按需点播)流源,您无法保证源和设备采样率完全相同。
对于短节目,您可以做的是缓冲一两个音频,如果您的播放速度很快,您将开始进入该保留,但希望不会超过它。同样,如果播放数据的速度比生成速度慢,则需要多余的缓冲区容量。但是当采样率差累积到缓冲储备大小以上时,这些最终会失败。
相反,流式传输工作" eternally"你需要一种方法来平衡生产和消费率。
A"懒惰"这样做的方法是使用逻辑,每隔一段时间增加或减少一个样本,具体取决于错误趋势的方向。但这在技术上引入了失真。
"花式"这样做的方法是使用一个可变的采样率转换器,其比率可以随时间调整,以抵消音频消耗率和生产率之间的误差。