2

AudioPlayerbufferqueue ソースと outputmix シンクでを作成しようとしています。ndk サンプルに示されているものと非常によく似た pcm 形式でソースを構成しましたが、OpenSL は拒否していSL_DATAFORMAT_PCMます (「データ形式 2」)。これは私には意味がありません。

エラーは次のとおりです(Samsung 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);

誰がこれを引き起こしているのか知っていますか? ありがとう!

4

2 に答える 2

5

お使いのデバイスでオーディオ サンプリング レートがサポートされていない可能性があります。SL_SAMPLINGRATE_8 テストする代わりに他のデバイス (Nexus 4/HTC One) を試すSL_SAMPLINGRATE_48か、選択してください。

音声通信中に歪んだ音が聞こえる場合は、レコーダーのバッファ サイズを増やし、サンプリング レートも変更してみてください。その他のサンプリング レート オプションはSL_SAMPLINGRATE_16SL_SAMPLINGRATE_32SL_SAMPLINGRATE_44_1などです。

Android デバイスごとに、特定の/推奨されるバッファ サイズとサンプリング レートがあります。次の Java コード セグメントから、適切なバッファ サイズとサンプリング レートを設定できます。audioManager.getProperty() は API レベル 17 未満では機能しないことに注意してください。

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);
于 2014-03-13T10:43:46.060 に答える
1

SLDataLocator_AndroidSimpleBufferQueueの代わりにを使用する必要があったことがわかりましたSLDataLocator_AndroidBufferQueue

于 2014-04-08T03:53:23.117 に答える