有没有办法使用不同采样率和缓冲区大小的Android上的打开来采样音频?

时间:2016-11-16 17:37:13

标签: audio android-ndk opensl

我已从android NDK门户网站下载了opensl的​​audio-echo应用程序。由于缺乏文档,我无法确定如何更改音频的采样率和缓冲区大小。

如果有人知道如何:

  • 在OpenSL上更改缓冲区大小和采样率
  • 读取要提供给要处理的C代码的缓冲区
  • 将OpenSL的输出模块送入扬声器

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

1 个答案:

答案 0 :(得分:1)

在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中。