Android:如何在C/ c++中获得首选(本地)音频缓冲区大小和音频采样率

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

本文关键字:音频 本地 缓冲区 采样率 c++ Android      更新时间:2023-10-16

要获得给定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操作系统的一部分。

不幸的是,我没有找到在本机代码中直接获得这些参数的方法。我最终通过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);