我有一个使用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
为什么我在快速模式下遇到问题,如果Nexus9有48000Hz?
我使用这种方法检查了它:
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
有没有更好的方法来获取设备的采样率?
答案 0 :(得分:1)
是的,有一种方法可以找到设备的首选采样率,尽管它适用于API级别&gt; 16. You can have a look at my answer here。
关于你的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采样率。但是,无论如何,你可以检查它是否支持。
答案 1 :(得分:0)
问题在于回调函数中的互斥。
UPD: OpenSLES Readme
已知问题
在48000Hz,Galaxy Nexus和Nexus 10会产生毛刺输出。在 44100Hz,Galaxy Nexus在切换活动时会出现故障或 提出大型对话框。触摸声偶尔会导致OpenSL 毛刺。禁用音频中的触摸声音可能是个好主意 应用。这些问题并不是特定于opensl_stream的问题 在其他环境中转载。