【发布时间】:2014-02-04 05:57:11
【问题描述】:
我想录制几个小时的 PCM 音频,但我只想在按下按钮 STOP 时保存最后 5 分钟的录音。这意味着当按下 START 并且录制已达到 5min 时,下一步将删除录制的开头并将额外的读取缓冲区附加到录制中,因此 5 min 始终保持不变。我需要使用 AudioRecord 来做到这一点。
我尝试使用 AudioRecord 类进行 20 秒的录音,而不是 5 分钟。我已将字节读入一个大字节 [] 缓冲区。当 START 被按下时,字节被读取到 byte[] 缓冲区,当达到 20s 时,它开始从头开始覆盖 byte[] 缓冲区,当达到 40s 时,它再次开始从头开始覆盖 byte[] 缓冲区,当按下 STOP 时 I将 byte[] 缓冲区重新排列为正确的顺序并写入文件。这种方法有效,但是使用它我需要从一开始就为 byte[] 缓冲区分配内存,而且 5 分钟太大了,我达到了堆大小限制并且内存不足。我正在使用 44100Hz 的采样率进行此操作。
那么,有没有更好的方法来进行如上所述的 5 分钟录制而不分配太多内存?
【问题讨论】:
-
我猜你使用的任何方法都至少需要这么多内存。
-
您可以通过 jni 代码中的本机分配和在那里实现的循环缓冲区来避免 java 堆大小限制,但是,您仍然在内存有限的设备上运行,并且 OOM 杀手会热情地调度当后台进程的内存不足时,后台进程。较低的采样率或单声道会减少内存需求,就像已经提到的压缩一样。
标签: java android audio audio-recording