2010-03-04 4 views
0

현재 마이크에서 수화기로 오디오를 반복하는 Android 애플리케이션을 만들려고 노력하고 있습니다.하지만 그 일은 완벽하게 수행 할 수 있습니다. 그러나 애플리케이션에서 반복적으로 사용하면 결국 얻을 수 있습니다. 메모리 부족 오류. 여기 java.lang.OutOfMemoryError on Audio Buffer


내가 오디오 루프를 만드는 데 사용하는 코드입니다 : 여기

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

According to the API docs에서

감사합니다, 당신은 녹음을 중지하고 인스턴스를 해제해야합니다. 그렇지 않으면 시스템 자원이 많이 소모되어 결국에는 시스템이 고갈됩니다. 필요한 정리 코드를 추가하면 제대로 작동합니다.

+0

Aaron을 응원하기 때문에 버퍼가 채워질 가능성이 있습니까? –

+1

아니요. 프로세스가 종료되지 않고 이전 버퍼가 다른 모든 개체와 함께 유지된다는 것을 의미합니다. 메모리는 절대로 시스템에 반환되지 않으므로 결국 메모리가 부족합니다. –