有没有什么方法可以使用 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 上的缓冲区大小和采样率
- 读取要馈送到要处理的 C 代码的缓冲区
- 馈送到 OpenSL 的输出模块以馈送到扬声器
我觉得另一种选择是以首选的采样率和缓冲区大小读取它,但在代码本身中进行下采样和上采样,并使用循环缓冲区来获取所需的数据。但是我们如何在 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 中有记录
我已经从 android 用于 opensl 的 NDK 门户下载了音频回声应用程序。由于缺少文档,我无法确定如何更改音频输入和输出的采样率和缓冲区大小。
如果有人知道如何:
- 更改 OpenSL 上的缓冲区大小和采样率
- 读取要馈送到要处理的 C 代码的缓冲区
- 馈送到 OpenSL 的输出模块以馈送到扬声器
我觉得另一种选择是以首选的采样率和缓冲区大小读取它,但在代码本身中进行下采样和上采样,并使用循环缓冲区来获取所需的数据。但是我们如何在 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 中有记录