我有一个使用OpenSL ES的应用程序。当我尝试在Nexus9 6.0.1上使用它时,我听到一种噪音,好像我有错误的采样率。在其他设备上,一切都没问题。
我的SLDataFormat_PCM结构:
SLDataFormat_PCM format_pcm = {
SL_DATAFORMAT_PCM,
aChannels,
48000 * 1000,
SL_PCMSAMPLEFORMAT_FIXED_16,
SL_PCMSAMPLEFORMAT_FIXED_16,
aChannels == 2 ? SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT
: SL_SPEAKER_FRONT_CENTER,
SL_BYTEORDER_LITTLEENDIAN
};当我在这个结构中改变采样率(+/- 1Hz)时,输出听起来没问题,但是我收到了一条AudioTrack调试消息:
W/AudioTrack: AUDIO_OUTPUT_FLAG_FAST denied by client; transfer 1, track 47999 Hz, output 48000 Hz
如果有48000赫兹,为什么我在快速模式下有问题?
我使用以下方法进行了检查:
jclass clazz = env.getEnv()->FindClass("android/media/AudioSystem");
jmethodID mid = env.getEnv()->GetStaticMethodID(clazz, "getPrimaryOutputSamplingRate", "()I");
int nSampleRate = env.getEnv()->CallStaticIntMethod(clazz, mid);
LOGDEBUG << "Sample Rate: " << nSampleRate;[ DBG:c894860f] 11:16:14.902: Sample Rate: 48000
有更好的方法来获取设备的采样率吗?
发布于 2016-04-05 20:44:58
问题在于回调函数中的互斥。
UPD:OpenSLES自述
已知问题 在48000 10,Galaxy和Nexus 10产生了浮躁的输出。在44100 up时,Galaxy在切换活动或启动大对话框时会出现故障。触摸的声音偶尔会导致OpenSL出现故障。在音频应用程序中禁用触摸声音可能是个好主意。这些问题并不是opensl_stream特有的,而是在其他环境中重复出现的。
发布于 2016-03-27 08:51:57
是的,有一种方法可以为设备找到首选的采样率,尽管它适用于API级别> 16. 你可以看看我的答案。
还有关于你的SLDataFormat_PCM结构。你已经初始化了样本率48k*1k!如果要在48k中对PCM数据进行采样,请尝试使用下面的代码。
// configure audio source
SLDataFormat_PCM format_pcm = {
SL_DATAFORMAT_PCM,
aChannels,
SL_SAMPLINGRATE_48,
SL_PCMSAMPLEFORMAT_FIXED_16,
SL_PCMSAMPLEFORMAT_FIXED_16,
aChannels == 2 ? SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT
: SL_SPEAKER_FRONT_CENTER,
SL_BYTEORDER_LITTLEENDIAN
};我以前没有和Nexus 9合作过,所以我不知道它是否支持48k采样率。但是无论如何,你可以检查它是否支持。
https://stackoverflow.com/questions/36172968
复制相似问题