我已从android NDK门户网站下载了opensl的audio-echo应用程序。由于缺乏文档,我无法确定如何更改音频的采样率和缓冲区大小。
如果有人知道如何:
我觉得另一个替代方案是以首选采样率和缓冲区大小读取它,但在代码本身中使用下采样和上采样,并使用循环缓冲区来获取所需数据。但是我们如何在openSL中读取和提供数据?
答案 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中。