【问题标题】:Core Audio: How to store buffers in RAM before writing to disk or deleting?Core Audio:如何在写入磁盘或删除之前将缓冲区存储在 RAM 中?
【发布时间】:2014-07-03 09:19:29
【问题描述】:

我的应用使用 Core Audio 分析音频缓冲区,长时间录制,但只向用户呈现该音频的几个样本。迄今为止,我一直在有选择地删除文件之前将所有内容写入磁盘。但是,写操作似乎对硬件要求很高,使用过多偶尔会引发崩溃。

我希望有一种方法可以避免写入操作,除非必要,这可以通过在写入磁盘或在不需要时从内存中释放它们之前将音频缓冲区(比如 1 分钟)存储在 RAM 中来完成。

谁能告诉我最有效的方法?

renderErr = AudioUnitRender(rioUnit, ioActionFlags,
                                    inTimeStamp, bus1, inNumberFrames, THIS->bufferList);

Analysis of buffer....

OSStatus s;

s = ExtAudioFileWriteAsync(THIS->mAudioFileRef, inNumberFrames, THIS->bufferList);

在有选择地运行循环将缓冲区写入磁盘之前,存储缓冲区的最佳容器是什么……?释放内存的最佳方法是什么?

【问题讨论】:

  • 写入磁盘不应该对硬件要求很高,更不用说导致崩溃了。 ExtAudioFileWriteAsyc() 非常有效。您的代码导致崩溃。你能分享更多你的代码吗?例如您是否正在调用 ExtAudioFileDispose() 将任何挂起的写入刷新到磁盘?
  • 崩溃是在持续写入数小时后发生的,主要发生在资源有限的旧硬件上。我测试了一些途径(并得到了 Apple 支持的一些帮助)。它触发了“内核恐慌”,这是非常不寻常的,并且与特定代码无关,而是与一段时间后无法应对的硬件相关联。是的,我使用 ExtAudioFileDispose。我通过减少写入(暂停)所花费的时间来大大减少崩溃的发生率,并且在没有写入的情况下运行时没有崩溃,因此得出结论是写入是问题所在。

标签: ios xcode core-audio


【解决方案1】:

使用大小为 2646000+1 或更大的样本数组的无锁循环队列或 fifo 可以在 RAM 中以 44.1 ksps 的速度存储 1 分钟的单声道音频。大多数 iOS 设备在为队列或 fifo 分配 6MB 或更多内存时不会出现问题。可以通过周期性轮询或 displaylink 计时器(从循环队列或 fifo 的尾部清空)在另一个线程中显示、分析或将这些数据写入磁盘。该数组使用的内存可以在音频单元停止后释放。

【讨论】:

  • 感谢您的提示,这比我想象的要容易得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-05
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多