Nexus 9主要采样率

时间:2016-03-23 08:21:09

标签: android android-ndk opensl

我有一个使用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

有没有更好的方法来获取设备的采样率?

2 个答案:

答案 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的问题   在其他环境中转载。