Android AudioTrack无法初始化

问题描述:

我在初始化android AudioTrack时遇到问题。我有Android 2.3.3的Nexus One。Android AudioTrack无法初始化

这是我的代码:

INT _rate = AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_SYSTEM);

INT缓冲区大小= AudioRecord.getMinBufferSize(_rate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);

AudioTrack ATRACK =新AudioTrack(AudioManager.STREAM_VOICE_CALL, _rate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, 缓冲区大小, AudioTrack.MODE_STREAM);

如果(atrack.getState()== AudioTrack.STATE_UNINITIALIZED) ...

所以ATRACK的状态始终AudioTrack.STATE_UNINITIALIZED

应用程序清单是

<application android:icon="@drawable/icon" android:label="@string/app_name"> 
    <activity android:name="BigLeftEarActivity" 
       android:label="@string/app_name"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

</application> 

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"></uses-permission> 
<uses-permission android:name="android.permission.BLUETOOTH"></uses-permission> 
<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission> 

<uses-sdk android:minSdkVersion="10" /> 

你能帮我吗?什么可能是错的?

谢谢!

我找到了解决方案:

线后

INT缓冲区大小= AudioRecord.getMinBufferSize(_rate,AudioFormat.CHANNEL_IN_MONO,AudioFormat.ENCODING_PCM_16BIT);

我加了

buffersize * = 2;

音轨已初始化。

这不是一个完美的解决方案。也许只需要将一个字节添加到缓冲区就足够了,但它可以工作。

“FECI狴迫退,faciant meliora potentes FECI狴迫退,faciant meliora potentes。”

+1

我有我的Nexus One相同的问题,我看到一个日志行一行 “minFrameCount 3072,帧数又1536”。然而,当然,我通过了3072作为缓冲区大小......这是一个Nexus的一个bug? – Ivan 2011-07-15 05:40:43

+1

您可能会发现这是因为“getMinBufferSize返回BYTES中的最小大小,如果您正在编写完全相同数量的SHORTS(每个都是两个字节),那么您将过度填充缓冲区;如果要写入一个字节数组的长度是确切的数字,你应该没有问题。 – protectedmember 2012-12-15 17:52:39

我想我找到了你的问题:

您正在使用AudioRecord.getMinBufferSize()为AudioTrack。你应该使用AudioTrack.getMinBUfferSize()来代替,这应该给你适当的值。

mAudioRecBufferSize = AudioRecord.getMinBufferSize(44100, AudioFormat.CHANNEL_IN_MONO , AudioFormat.ENCODING_PCM_16BIT);

mAudioPlayBufferSize = AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_OUT_MONO , AudioFormat.ENCODING_PCM_16BIT);