我需要创建一个 VOIP 应用程序,并且我正在使用 OpenSL ES。我需要为所有 Android 设备以 8KHz 采样率捕获和播放 pcm 音频数据。但是,当我以 8KHz 采样率捕获音频并同时播放(语音通信)时,它会产生噪音,并且对于某些设备(如三星 Galaxy S3、S4 等),音频会失真。我知道,有一个特定的首选采样率对于每个设备,我想知道是否有任何解决方法或任何方法可以仅使用 8KHz 采样率而不会出现任何失真?
我尝试增加缓冲区大小和许多其他事情,但未能找到最佳且通用的解决方案。我的编码器和解码器需要以 8KHz 采样的音频数据。作为我的第二个想法,我在将音频数据传递到编码器或解码器之前对其进行了重新采样,但这不是我正在寻找的解决方案。
我发现 CSipSimple 使用了 OpenSL,我也浏览了他们的一些代码。但是,我仍然找不到解决方案,可能是我不明白该集中精力在哪里。
我被困在这里了!
这是我解决问题的方法:
我正在使用 OpenSL ES 开发 Android 音频流,this教程对我帮助很大。我按照这里的说明进行操作并让事情正常工作。然后我发现使用这种方法的音频流对于某些设备(主要是三星设备)来说效果不佳。我尝试了很多事情,例如增加缓冲区大小、禁用环境混响等。我发现this答案对于提高流媒体性能非常有用。
最后,我发现音频失真,因为我必须使用锁来同步缓冲区开关。建议使用无锁结构以获得更好的音频性能。然后我采用了 Victor Lazzarini 的另一种方法,即无锁音频 IO。这篇文章的Android 上使用 OpenSL ES 的无锁音频 IO对实现无锁结构以及更好的音频性能有很大帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)