音频缓冲区上的 java.lang.OutOfMemoryError

标签 java android memory buffer out-of-memory

我目前正在尝试创建一个 Android 应用程序,将音频从麦克风循环到耳机,我可以完美地做到这一点,但是当我在应用程序中一遍又一遍地执行此操作时,我最终会出现内存不足错误。

<小时/>

这是我用来创建音频循环的代码:

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 次后我收到错误。

所以我认为缓冲区只是变满了还是什么?那是对的吗?如果是这样,我将如何继续清除缓冲区?

提前致谢

最佳答案

According to the API docs ,您必须停止录制并释放实例。否则,它会占用系统资源,你最终会用完。因此,添加必要的清理代码,它应该可以工作。

关于音频缓冲区上的 java.lang.OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2379034/

相关文章:

java - GSON - 从字符串中获取 JSON 值

performance - Elasticsearch高映射Buffer_Pools

java - 使用 Apache Kafka 进行实时消息传递

java - 通过java代码初始化EditTextPreference的defaultValue

java - 如何在Android中获取应用程序数据目录

javascript - Android - 如何在 Android WebView 中使用 Javascript?

android - fragment 中的 recyclerview 空指针异常

python - Dask Dataframe 独特操作 : Worker running out of memory (MRE)

c++ - 大数据的内存组织

java - 如何使用 Spring-data-Redis 实现 Redis Multi-Exec