2016-11-16 18 views
0

我已經從opensl的​​android NDK門戶下載了audio-echo應用程序。由於缺少文檔,我無法確定如何更改音頻的採樣率和緩衝區大小。有沒有什麼方法可以在android上以不同的採樣率和緩衝區大小打開來採樣音頻?

如果有人有關於如何任何想法:

  • 變化OpenSL
  • 緩衝區大小和採樣率讀取緩衝器被輸送到將被處理
  • 饋送到一個C代碼OpenSL的輸出模塊,以被饋送到揚聲器

另一種選擇我感到的優選採樣速率和緩衝器大小被讀出,但下取樣並在代碼本身上採樣,並使用一個斷路器操作過lar緩衝區來獲得所需的數據。但我們如何在openSL中讀取和提供數據?

回答

1

在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。

相關問題