要获得给定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上可用,我不知道如何获得支持的麦克风和扬声器采样率。此外,该结构不包含有关首选缓冲区大小的信息。
答案 0 :(得分:1)
当然,这不是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);
按照您的意愿添加错误处理。