【问题标题】:how to record PCM for hours , but save only last 5min of recording when stopped?如何录制数小时的 PCM,但停止时只保存最后 5 分钟的录制?
【发布时间】: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


【解决方案1】:

如果你没有足够的内存,你有两个选择。

首选是使用磁盘作为缓冲区,如果有的话,这很简单,但如果你的磁盘是基于闪存的,你会无缘无故地磨损它。

第二个选择是压缩。如果您不需要 PCM,您可以将其编码为 MP3。如果您需要 PCM,可能还有其他选择。声音是非常多余的,应该是相当可压缩的,甚至是无损的。但迟早你会达到 RAM 的极限。

【讨论】:

    【解决方案2】:

    将其写入文件而不是保存在内存中?

    【讨论】:

    • 请记住,我必须记录多个小时。当按下停止时,仅保存最后 5 分钟。 PCM 文件占用大量空间,录制几个小时不是一个好主意
    • 我认为建议是对您尝试在内存中执行的临时文件执行相同的循环缓冲。但是,如果这增加了闪存写入寿命的大量消耗,可能值得考虑。
    • 您所说的 AudioRecord 类回到开头并覆盖...有时称为“循环缓冲区”。 Buddy probaby 旨在让您在文件中实现循环缓冲区。也就是说,五分钟后,回到文件的开头并继续覆盖它。
    • 问题是当我开始覆盖文件时,文件中的所有数据都丢失了,只剩下新的覆盖信息。除非有办法保留旧数据,否则我的意思是像简单的 byte[] 缓冲区一样覆盖文件。有没有这样的方法?
    • 这是由于您用于访问文件的特定 java API,而不是使用文件的想法,因此可以正确解决。 (虽然我更喜欢它而不是一开始就使用文件的想法,但“今天”的一个非常粗略的解决方法是使用 20 秒文件的数组。)
    猜你喜欢
    • 2013-12-04
    • 2013-08-02
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 2014-06-13
    相关资源
    最近更新 更多