Android:如何在C/ c++中获得首选(本地)音频缓冲区大小和音频采样率
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操作系统的一部分。
不幸的是,我没有找到在本机代码中直接获得这些参数的方法。我最终通过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);
相关文章:
- 用c++阅读音频
- 将地址分配给本地指针后,公共对象的变量将消失
- 如何在本地机器上运行c++和javascript客户端代码(hackerbank风格)
- 为什么这个音频包络不能通过开关的情况?
- 编写代码时C++出现错误:错误 1 错误 C2601:'circle':本地函数定义是非法的
- FFMpeg库:如何在音频文件中精确查找
- 如何使用 Boost Asio 在 Android 上获取我的本地 udp IP 地址?
- 需要反转音频步进公式
- 如何在音频处理中使用超能力时间拉伸类
- 在成员dynamic_bitset上使用 boost::from_block_range 时出错,但在本地dynamic
- 在本地网络中通过OpenCV(C++)实时流式传输图像
- C++:在被本地字符串捕获后释放或销毁 malloc'd char *?
- C++:处理线程本地对象销毁
- 如何强制 Thrift 仅接受来自本地主机的连接
- C++新手,想知道如何使用VS code 2019播放音频文件
- 如何暂停插孔音频客户端
- 将对象创建为全局/静态对象会崩溃,而本地对象不会崩溃
- 如何以编程方式将音频从任何录制设备路由到任何播放设备
- 可视化音频波形从视频本地文件使用Qmedia播放器
- Android:如何在C/ c++中获得首选(本地)音频缓冲区大小和音频采样率