Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:如何在C/C+中获得首选(本机)音频缓冲区大小和音频采样率+;?_Android_C++_C_Android Audiomanager_Opensl - Fatal编程技术网

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

Android:如何在C/C+中获得首选(本机)音频缓冲区大小和音频采样率+;?,android,c++,c,android-audiomanager,opensl,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_OUTP

要获取给定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结构和SlaudioOutInputDescriptor,但如果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);

添加您希望的错误处理。

我以前使用过OpenSL,我需要与您完全相同的东西。如果我们可以在本机端获取首选的采样率,这会更好,因为JavaAPI支持API级别17或更高。所以我贴出了我的问题,然后自己解决了。你也可以看看这个问题和答案。如果你有类似的情况,这可能会对你有所帮助。SLAudioOutputDescriptor和SLAudioInputDescriptor未在Android上实现。Reaz的回答看起来是对当前最佳实践的一个很好的总结,我不一定会说“当然”,但Java调用确实是获取这些信息的唯一途径。