java.lang.OutOfMemoryError в аудио буфере - PullRequest
0 голосов
/ 04 марта 2010

В настоящее время я пытаюсь создать приложение для Android, которое передает звук от микрофона к наушнику, я могу это сделать идеально, но когда я делаю это снова и снова в моем приложении, я в конечном итоге получаю ошибку Out Of Memory. *


Вот код, который я использую для создания аудио-петли:

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)

Таким образом, ошибка специально фокусируется на этой строке в коде

short[] readBuffer = new short[bufferSize];

И это происходит после того, как я несколько раз пытаюсь выполнить цикл, скажем, я запускаю приложение, и после 10 раз запуска цикла я получаю ошибку.

Так что я думаю, что буфер просто заполняется или что-то в этом роде ?? Это верно? Если так, как я буду продолжать очищать буфер?

Заранее спасибо

1 Ответ

1 голос
/ 04 марта 2010

Согласно документации API , вы должны остановить запись и освободить экземпляр. В противном случае, это потребует системных ресурсов, и вы в конечном итоге закончите. Поэтому добавьте необходимый код очистки, и он должен работать.

...