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

标签 android audio android-ndk opensl

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

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

我发现 CSipSimple 使用 OpenSL,我也浏览了他们的一些代码。但是,我仍然找不到解决方案,可能是我不知道该把注意力集中在哪里。 我被困在这里了!

最佳答案

这是我解决问题的方法:

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

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

关于android - 使用 OpenSL 的所有安卓设备以 8KHz 采样率进行语音通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22342040/

相关文章:

android - 哪些安卓设备支持ADK/open配件

java - 当来电通过特定音频应答时,音频重叠

c# - 通过此代码更改音频采样率,当前会更改位深度吗?

android - Gradle 项目同步失败,没有工具链

安卓NDK : calling java method from JNI C class

android - 用于编辑联系人的蜂窝同步适配器功能

java - 无法正确转换 JSON 数据

java - 适配器内 Intent 的 Android 错误消息

iphone - 使用afconvert将iPhone的WAV转换为CAF时出错

Android:构建平台源后,如何使用平台 key 签署任意APK?