有没有什么方法可以使用 opens on android 以不同的采样率和缓冲区大小对音频进行采样?

Is there any way to sample audio using opens on android with different sampling rates and buffer sizes?

我已经从 android 用于 opensl 的 NDK 门户下载了音频回声应用程序。由于缺少文档,我无法确定如何更改音频输入和输出的采样率和缓冲区大小。

如果有人知道如何:

我觉得另一种选择是以首选的采样率和缓冲区大小读取它,但在代码本身中进行下采样和上采样,并使用循环缓冲区来获取所需的数据。但是我们如何在 openSL 中读取和提供数据?

在 OpenSL ES API 中,有创建播放器或记录器的调用:

SLresult (*CreateAudioPlayer) (
    SLEngineItf self,
    SLObjectItf * pPlayer,
    SLDataSource *pAudioSrc,
    SLDataSink *pAudioSnk,
    SLuint32 numInterfaces,
    const SLInterfaceID * pInterfaceIds,
    const SLboolean * pInterfaceRequired
);

SLresult (*CreateAudioRecorder) (
    SLEngineItf self,
    SLObjectItf * pRecorder,
    SLDataSource *pAudioSrc,
    SLDataSink *pAudioSnk,
    SLuint32 numInterfaces,
    const SLInterfaceID * pInterfaceIds,
    const SLboolean * pInterfaceRequired
);

请注意,这两个都有一个 SLDataSource *pAudioSrc 参数。

要使用自定义播放速率或录制速率,您必须正确设置此数据源。

我使用此代码使用 11Khz 播放速率:

// Configure data format.
SLDataFormat_PCM pcm;
pcm.formatType = SL_DATAFORMAT_PCM;
pcm.numChannels = 1;
pcm.samplesPerSec = SL_SAMPLINGRATE_11_025;
pcm.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16;
pcm.containerSize = 16;
pcm.channelMask = SL_SPEAKER_FRONT_CENTER;
pcm.endianness = SL_BYTEORDER_LITTLEENDIAN;

// Configure Audio Source.
SLDataSource source;
source.pFormat = &pcm;
source.pLocator = &bufferQueue;

为了向扬声器提供数据,使用了一个由回调填充的缓冲队列。要设置此回调,请使用 SLAndroidSimpleBufferQueueItf,在 OpenGL ES specification.

的第 8.12 节 SLBufferQueueItf 中有记录