2016-06-02 8 views
1

私はOpenSLコンテキストを作成して、それがサウンドを再生するように管理しました。
しかし、私はまだ問題があります:samplesPerSecを私のプレーヤーのために44.100 Hzに設定しましたが、実際には〜70.000 Hzで実行されます。どのようにそれを修正することができますか?Android上のOpenSLは、それよりも高いレートで再生されます

さて私は、私は(Source Codeでフル)何をやったかを紹介します:

PolyOpenSLInterface.cppで私はOpenSLを初期化し、私のSLAndroidSimpleBufferQueueItfにバッファをエンキュー開始しています。 は、私は次のようにプレーヤーを作成します。

私の登録したコールバックは(私は既に使用されているバッファを取り、その中に次のサンプルを書いて、再びバッファをキュー)このようになります
SLDataLocator_AndroidSimpleBufferQueue lDataLocatorIn; 
lDataLocatorIn.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE; 
lDataLocatorIn.numBuffers = 1; 

SLDataFormat_PCM lDataFormat; 
lDataFormat.formatType = SL_DATAFORMAT_PCM; 
lDataFormat.numChannels = POLY_NUM_CHANNELS; 
lDataFormat.samplesPerSec = SL_SAMPLINGRATE_44_1; //sampling rate 44.100Hz 
lDataFormat.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16; 
lDataFormat.containerSize = SL_PCMSAMPLEFORMAT_FIXED_16; 
if(POLY_NUM_CHANNELS > 1){ 
    lDataFormat.channelMask = SL_SPEAKER_FRONT_RIGHT | SL_SPEAKER_FRONT_LEFT; 
} else { 
    lDataFormat.channelMask = SL_SPEAKER_FRONT_CENTER; 
} 
lDataFormat.endianness = SL_BYTEORDER_LITTLEENDIAN; 

SLDataSource lDataSource; 
lDataSource.pLocator = &lDataLocatorIn; 
lDataSource.pFormat = &lDataFormat; 

SLDataLocator_OutputMix lDataLocatorOut; 
lDataLocatorOut.locatorType = SL_DATALOCATOR_OUTPUTMIX; 
lDataLocatorOut.outputMix = mOutputMixObj; 

SLDataSink lDataSink; 
lDataSink.pLocator = &lDataLocatorOut; 
lDataSink.pFormat = NULL; 

const SLuint32 lSoundPlayerIIDCount = 2; 
const SLInterfaceID lSoundPlayerIIDs[] = { SL_IID_PLAY, SL_IID_ANDROIDSIMPLEBUFFERQUEUE }; 
const SLboolean lSoundPlayerReqs[] = { SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE }; 

lRes = (*mEngine)->CreateAudioPlayer(mEngine, &mPlayerObj, &lDataSource, &lDataSink, lSoundPlayerIIDCount, lSoundPlayerIIDs, lSoundPlayerReqs); 
lRes = (*mPlayerObj)->Realize(mPlayerObj, SL_BOOLEAN_FALSE); 

void OpenSLAudioInterface::queueCallback(SLAndroidSimpleBufferQueueItf caller, void* pContext){ 
    OpenSLAudioInterface *audioInterface = (OpenSLAudioInterface*) pContext; 
    if(audioInterface->buffer && audioInterface->getMixer()) { 
     int16_t *out = (int16_t*)audioInterface->buffer; 
     audioInterface->getMixer()->mixIntoBuffer(out, POLY_FRAMES_PER_BUFFER); 
     (*(audioInterface->mPlayerQueue))->Enqueue(audioInterface->mPlayerQueue, out, sizeof(int16_t)*POLY_FRAMES_PER_BUFFER*POLY_NUM_CHANNELS); 
    } 
} 

だから誰も説明することができますなぜ音はそれよりも~2 times fasterを再生する必要があり、私はバッファを埋めるために混合する必要があるサンプルは~2のファクタで44.100Hzを超えていますか?
循環バッファを使用する必要がありますか(私がここで使用しているものはまだOpenSLで使用されていますか?)

事前にお寄せいただきありがとうございます。

+0

'lDataFormat.samplesPerSec = SL_SAMPLINGRATE_48;あなたのサンプリングレートは48kHzですが、あなたは44.1kHzでオーディオを再生しようとしています。もう1つは 'lDataFormat.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16;'という行です - これは16ビット/ PCMのオーディオデータです。しかし、たいていの場合、通常は 'SL_PCMSAMPLEFORMAT_FIXED_8'が見つかります。 –

+0

ああ..私はプロジェクトのデフォルトに従うために44.1に調整したので、質問を編集しました。そして、int16_tは16ビットを使うべきではありませんか? (私は8bitでテストしますが) – fodinabor

+0

@ReazMurshed nope 8bitは音をひどく上げています....それは16bitでなければなりません。 – fodinabor

答えて

0

私はこの問題を解決しました。
私は実際にOpenSLを2回初期化し、1つのソースから2つの同時バッファキューに書き込みを開始しました。これは、フレームの半分が正しく再生されないことにつながります。

関連する問題