4

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

我尝试增加缓冲区大小和许多其他事情,但未能找到最佳和通用的解决方案。我的编码器和解码器需要以 8KHz 采样的音频数据。作为我的第二个想法,我在将音频数据传递给我的编码器或解码器之前对其进行了重新采样,但这不是我正在寻找的解决方案。

我发现 CSipSimple 使用了 OpenSL,并且我也浏览了他们的一些代码。但是,我找不到解决方案,可能是我不明白该集中在哪里。我被困在这里了!

4

1 回答 1

3

这是我解决问题的方法:

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

最后,我发现音频失真是因为我必须使用锁来同步缓冲开关。建议使用无锁结构以获得更好的音频性能。然后我采用了 Victor Lazzarini 的另一种方法,即无锁音频 IO。这篇文章在 Android 上使用 OpenSL ES 实现无锁音频 IO对实现无锁结构以及更好的音频性能有很大帮助。

于 2014-03-24T10:26:15.000 回答