使用OpenSL的所有Android设备以8KHz采样率进行语音通信

时间:2014-03-12 04:27:06

标签: android audio android-ndk opensl

我需要创建一个VOIP应用程序,我正在使用OpenSL ES。我需要以8KHz的采样率捕获并播放所有Android设备的pcm音频数据。但是,当我以8KHz的采样率捕获音频并同时播放(语音通信)时,它会产生噪音,并且对于某些设备(如Samsung Galaxy S3,S4等)的音频会失真。我知道,有一个特定的首选采样率对于每个设备,我想知道是否有任何解决方法或任何方式使用8KHz采样率只是没有任何失真?

我尝试增加缓冲区大小和许多其他方面,但未能找到最佳和通用的解决方案。我需要为我的编码器和解码器以8KHz采样的音频数据。我把音频数据重新采样,然后传递给我的编码器或解码器,这是我的第二个想法,但它不是我想要的解决方案。

我发现CSipSimple使用了OpenSL,我也经历了一些代码。但是,我找不到解决办法,也许我无法理解在哪里集中注意力。 我被困在这里了!

1 个答案:

答案 0 :(得分:3)

以下是我解决问题的方法:

我正在使用OpenSL ES处理Android的音频流,this教程帮助了我很多。我按照这里的说明进行操作。然后我发现使用这种方法的音频流对某些设备(主要是三星设备)效果不佳。我尝试了很多东西,例如增加缓冲区大小,禁用环境混响等等。我发现this回答对提高流媒体性能非常有用。

最后,我发现音频失真是因为我必须使用同步缓冲开关的时钟。建议使用无锁结构以获得更好的音频性能。然后我选择了Victor Lazzarini的另一种方法,即无锁音频IO。这篇Lock-free audio IO with OpenSL ES on Android文章帮助实现了无锁结构以及更好的音频性能。