java Android OpenSL“pAudioSrc:data format 2 not allowed”拒绝SL_DATAFORMAT_PCM?
我正在尝试创建一个AudioPlayer
带有缓冲队列源和outputmix接收器。我已经用与ndk示例中所示非常相似的pcm格式配置了源代码,但是OpenSL拒绝了SL_DATAFORMAT_PCM
(“数据格式2”)。这对我来说毫无意义
以下是错误(在三星Galaxy S2上):
02-27 15:43:47.315: E/libOpenSLES(12681): pAudioSrc: data format 2 not allowed
02-27 15:43:47.315: W/libOpenSLES(12681): Leaving Engine::CreateAudioPlayer (SL_RESULT_CONTENT_UNSUPPORTED)
以下是相关代码:
SLuint32 channels = 2;
SLuint32 speakers = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;
SLuint32 sr = SL_SAMPLINGRATE_48;
//...
SLDataFormat_PCM format_pcm = {
SL_DATAFORMAT_PCM,
channels,
sr,
SL_PCMSAMPLEFORMAT_FIXED_16,
SL_PCMSAMPLEFORMAT_FIXED_16,
speakers,
SL_BYTEORDER_LITTLEENDIAN
};
// Configure audio player source
SLDataLocator_AndroidBufferQueue loc_bufq =
{SL_DATALOCATOR_ANDROIDBUFFERQUEUE, 2};
SLDataSource audioSrc = {&loc_bufq, &format_pcm};
// configure audio player sink
SLDataLocator_OutputMix loc_outmix =
{SL_DATALOCATOR_OUTPUTMIX, outputMixObject};
SLDataSink audioSnk = {&loc_outmix, NULL};
// create audio player
const SLInterfaceID iidsOutPlayer[] = {SL_IID_ANDROIDBUFFERQUEUESOURCE};
const SLboolean reqsOutPlayer[] = {SL_BOOLEAN_TRUE};
result = (*engineItf)->CreateAudioPlayer(
engineItf,
&(outPlayerObject),
&audioSrc, &audioSnk,
1, iidsOutPlayer,reqsOutPlayer);
有人知道这是什么原因吗?谢谢
# 1 楼答案
结果是我需要使用
SLDataLocator_AndroidSimpleBufferQueue
而不是SLDataLocator_AndroidBufferQueue
# 2 楼答案
可能是您的设备不支持音频采样率。试试
SL_SAMPLINGRATE_8
而不是SL_SAMPLINGRATE_48
或选择其他设备(Nexus 4/HTC One)进行测试如果您在语音通信时听到失真的声音,请增加记录器缓冲区大小,您也可以尝试更改采样率。其他采样率选项有:
SL_SAMPLINGRATE_16
、SL_SAMPLINGRATE_32
、SL_SAMPLINGRATE_44_1
等每个android设备都有一个特定/首选的缓冲区大小和采样率。您可以从下面的java代码段中获得首选的缓冲区大小和采样率。请注意,audioManager。getProperty()不适用于API级别<;十七,