2011-07-17 18 views
1

我正在为类AudioTrack为Android的一个应用程序工作,有时我得到异常“音频缓冲区大小无效”。由于我打算使用FFT,因此我将缓冲区大小设置为2的倍数,从那时起,有时候我会得到这个异常。任何想法是为什么?您是否尝试过使用Android中的Class AudioTrack,其缓冲区大小为2的幂数?

感谢, 丹尼尔

我的代码是非常简单的:

private void playTrack(short []buffer){ 
     try{ 
      Log.i(TAG,"Play track, Buffer size: "+buffer.length); 
      AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 
        mAudioIn.getFrequency(), 
        mAudioIn.getChannelConfig(), 
        mAudioIn.getAudioEncoding(), 
        buffer.length, 
        AudioTrack.MODE_STREAM); 
      audioTrack.play(); 

      audioTrack.write(buffer, 0, buffer.length); 
     }catch(Throwable t){ 
      Log.e(TAG,"Play track, something's wrong: "+t.getMessage()+ " When buffer size is:"+buffer.length); 
     } 

    }`enter code here` 

回答

0

尝试调用像

_audioTrackSize = android.media.AudioTrack.getMinBufferSize(
      audioSampleRate, AudioFormat.CHANNEL_CONFIGURATION_STEREO, 
      AudioFormat.ENCODING_PCM_16BIT); 

,然后轮返回的最小尺寸可达二的幂。

2

我刚刚意识到,你不能使用奇数作为缓冲区大小。尝试采取你的尺寸,做这样的事情:

if (size % 2 == 1) 
    size++;` 

这将使奇数偶数。

+0

是的文档说缓冲区大小需要是帧大小的倍数。但是文档从来不解释“框架”是什么。 – Curtis