安卓 : How to get the preferred (native) audio buffer size and audio sample rate in C/C++?

标签 android c++ c android-audiomanager opensl

要获得给定 Android 设备的首选音频缓冲区大小和音频采样率,您可以执行以下 Java 代码:

// To get preferred buffer size and sampling rate.
AudioManager audioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
String rate = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE);
String size = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);
Log.d("Buffer Size and sample rate", "Size :" + size + " & Rate: " + rate);

是否可以改为使用 C/C++ 执行此操作?

如果是,怎么做到的?

openSLES API 似乎不提供此功能。我确实注意到 openSLES.h 定义了一个 SLAudioInputDescriptor 结构以及一个 SLAudioOutputDescriptor,但如果这在 Android 上可用,我不确定如何获得支持的麦克风和扬声器采样率。此外,该结构不包含有关首选缓冲区大小的信息。

最佳答案

当然这不是 OpenSL ES API 的一部分,这些参数是特定于 Android 的并且是 Android 操作系统的一部分。

不幸的是,我没有找到直接在 native 代码中获取这些参数的方法。我最终通过 JNI 调用了 Java 函数。

伪代码如下:

    jclass audioSystem = env->FindClass("android/media/AudioSystem");
    jmethodID method = env->GetStaticMethodID(audioSystem, "getPrimaryOutputSamplingRate", "()I");
    jint nativeOutputSampleRate = env->CallStaticIntMethod(audioSystem, method);
    method = env->GetStaticMethodID(audioSystem, "getPrimaryOutputFrameCount", "()I");
    jint nativeBufferLength = env->CallStaticIntMethod(audioSystem, method);

按照您的意愿添加错误处理。

关于安卓 : How to get the preferred (native) audio buffer size and audio sample rate in C/C++?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32028810/

相关文章:

Android AOSP 构建在 MacOS 10.14 上失败

c++ - 如何忽略除第一个字符以外的所有字符?

c++ - 函数返回指向 int 的指针

c++ - 检查输入是否是正确的整数

c - 循环无限运行

python - 专门为涉及线程和图形的项目研究 Python

android - 更改 DatePickerDialog 的按钮文本

android - 抽屉导航项目未注册点击事件

android - 使用包含参数的 json 对象改造 POST

c++ - VC++11 映射和多映射迭代器(重载)C2535