![](/img/trans.png)
[英]Android OpenSL Audio Buffer underrun with native sample rate/buffer size (only some devices)
[英]Android : How to get the preferred (native) audio buffer size and audio sample rate in C/C++?
要獲得給定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 OS的一部分。
不幸的是,我發現無法直接在本機代碼中獲取這些參數。 我最終通過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);
按照您的意願添加錯誤處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.