Java 安卓OpenSL“;pAudioSrc:不允许使用数据格式2拒绝SL_数据格式_PCM?

Java 安卓OpenSL“;pAudioSrc:不允许使用数据格式2拒绝SL_数据格式_PCM?,java,android,android-ndk,opensl,Java,Android,Android Ndk,Opensl,我正在尝试创建一个带有bufferqueue源和outputmix接收器的AudioPlayer。我已经使用与ndk示例中所示非常相似的pcm格式配置了源代码,但OpenSL拒绝使用SL\u DATAFORMAT\u pcm(“数据格式2”)。这对我来说毫无意义 以下是错误(在三星Galaxy S2上): 以下是相关代码: SLuint32 channels = 2; SLuint32 speakers = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIG

我正在尝试创建一个带有bufferqueue源和outputmix接收器的
AudioPlayer
。我已经使用与ndk示例中所示非常相似的pcm格式配置了源代码,但OpenSL拒绝使用
SL\u DATAFORMAT\u pcm
(“数据格式2”)。这对我来说毫无意义

以下是错误(在三星Galaxy S2上):

以下是相关代码:

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);

有人知道这是什么原因吗?谢谢

可能是您的设备不支持音频采样率。请尝试
SL\u采样光栅8
不要选择SL_采样,而是选择其他设备(Nexus 4/HTC One)进行测试

如果您在语音通信时听到失真的声音,请增加记录器缓冲区大小,您也可以尝试更改采样率。其他采样率选项有:
SL\u采样率16
SL\u采样率32
SL\u采样率44\u 1


每个android设备都有一个特定/首选的缓冲区大小和采样率。您可以从下面的java代码段中获得首选的缓冲区大小和采样率。请注意,audioManager.getProperty()不适用于API级别结果是我需要使用
SLDataLocator\u AndroidSimpleBufferQueue
而不是
SLDataLocator\u AndroidBufferQueue

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);
AudioManager audioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
String rate = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE);
String size = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);
Log.d("Buffer Size and sample rate", "Size :" + size + " & Rate: " + rate);