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 번 오류가 발생합니다.
그래서 버퍼가 단순히 전체적으로 또는 뭔가를 이루고 있다고 생각합니까 ?? 그 맞습니까? 그렇다면 어떻게 버퍼를 지울 것입니까? 사전
Aaron을 응원하기 때문에 버퍼가 채워질 가능성이 있습니까? –
아니요. 프로세스가 종료되지 않고 이전 버퍼가 다른 모든 개체와 함께 유지된다는 것을 의미합니다. 메모리는 절대로 시스템에 반환되지 않으므로 결국 메모리가 부족합니다. –