【问题标题】:Android : How to get the preferred (native) audio buffer size and audio sample rate in C/C++?Android:如何在 C/C++ 中获得首选(本机)音频缓冲区大小和音频采样率?
【发布时间】:2015-11-08 19:35:39
【问题描述】:

要获取给定 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,我需要和你一样的东西。如果我们可以在本机端获取首选采样率会更好,因为 Java API 支持 API 级别 17 或更高。所以我发布了我的确切问题,然后自己解决了。你也可以看看这个问题和答案。如果您有类似的情况,这可能会对您有所帮助。 stackoverflow.com/questions/22342040/…
  • SLAudioOutputDescriptor 和 SLAudioInputDescriptor 未在 Android 上实现。 Reaz 的回答看起来像是对当前最佳实践的一个很好的总结。

标签: android c++ c android-audiomanager opensl


【解决方案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);

根据需要添加错误处理。

【讨论】:

  • 我不一定会说“当然”,但确实 Java 调用是获取此信息的唯一方法。
猜你喜欢
  • 2012-02-03
  • 1970-01-01
  • 2022-08-21
  • 1970-01-01
  • 2017-07-10
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多