0
我目前正在尝试创建一个Android应用程序,将麦克风从音频循环到听筒,我可以做到这一点,但是当我在应用程序中一遍又一遍地执行操作时,内存不足错误。音频缓冲区上的java.lang.OutOfMemoryError
这里是我用来创建音频循环代码:
static final int bufferSize = 200000;
final short[] buffer = new short[bufferSize];
short[] readBuffer = new short[bufferSize];
public void run() {
isRecording = true;
android.os.Process.setThreadPriority
(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
int buffersize = AudioRecord.getMinBufferSize(11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
arec = new AudioRecord(MediaRecorder.AudioSource.MIC,
11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
MediaRecorder.AudioEncoder.AMR_NB,
buffersize);
atrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL,
11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
MediaRecorder.AudioEncoder.AMR_NB,
buffersize,
AudioTrack.MODE_STREAM);
Log.d("AUDIO", "sample rate = : " + arec.getSampleRate());
atrack.setPlaybackRate(11025);
byte[] buffer = new byte[buffersize];
arec.startRecording();
atrack.play();
while(isRecording) {
arec.read(buffer, 0, buffersize);
atrack.write(buffer, 0, buffer.length);
}
}
,这里是错误,我得到:
ERROR/AndroidRuntime(3442): Uncaught handler: thread main exiting due to uncaught exception
ERROR/AndroidRuntime(3442): java.lang.OutOfMemoryError
ERROR/AndroidRuntime(3442): at com.phone.engine.CallAudio$Record.<init>(CallAudio.java:114)
ERROR/AndroidRuntime(3442): at com.phone.engine.CallAudio.onCreate(CallAudio.java:42)
ERROR/AndroidRuntime(3442): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2465)
ERROR/AndroidRuntime(3442): at android.app.ActivityThread.access$2800(ActivityThread.java:112)
ERROR/AndroidRuntime(3442): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1744)
ERROR/AndroidRuntime(3442): at android.os.Handler.dispatchMessage(Handler.java:99)
ERROR/AndroidRuntime(3442): at android.os.Looper.loop(Looper.java:123)
ERROR/AndroidRuntime(3442): at android.app.ActivityThread.main(ActivityThread.java:3948)
ERROR/AndroidRuntime(3442): at java.lang.reflect.Method.invokeNative(Native Method)
ERROR/AndroidRuntime(3442): at java.lang.reflect.Method.invoke(Method.java:521)
ERROR/AndroidRuntime(3442): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
ERROR/AndroidRuntime(3442): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
ERROR/AndroidRuntime(3442): at dalvik.system.NativeStart.main(Native Method)
所以错误特别关注代码
0123中的这一行short[] readBuffer = new short[bufferSize];
它发生在我尝试做几次循环后,所以说我启动应用程序,并在10次循环开始后,我得到的错误。
所以我认为缓冲区简直是完全或东西?那是对的吗?如果是这样,我将如何清理缓冲区?
在此先感谢
干杯亚伦,所以它很可能是填补了缓冲区? – 2010-03-04 12:25:53
没有。这只是意味着进程永远不会终止,旧的缓冲区仍然存在(与所有其他对象一起)。由于内存永远不会返回到系统,您最终会用完它。 – 2010-03-04 12:45:12