1

我正在使用通常的设置从设备的麦克风AVAudioEngine获取流。AVAudioPCMBuffersinstallTap(onBus:)

为了将音频流分发到程序的其他部分,我将缓冲区发送到类似于以下内容的组合发布者:

private let publisher = PassthroughSubject<AVAudioPCMBuffer, Never>()

我开始怀疑缓冲区存在某种并发或内存管理问题,因为在其他地方使用缓冲区时,我遇到了一系列崩溃,表明缓冲区中的某些内部指针为 NULL(具体来说,我是vDSP.convertElements(of:to:)当我尝试使用 ) 从缓冲区中读取样本时看到崩溃floatChannelData

这些崩溃正在生产中并且相当罕见——我无法在本地重现它们。

我从不修改音频缓冲区,只读取它们进行分析。


我的问题是:是否可以放入AVAudioPCMBuffers组合管道?该类不会像我假设的AVAudioPCMBuffer那样保留/释放底层的内存吗?AudioBufferList这是一个根本有缺陷的方法吗?

4

1 回答 1

1

我在音频回调函数、块或点击中的规则总是立即将任何要处理的数据从 PCM 缓冲区复制到您自己的私有样本缓冲区中。然后,您可以在自己方便的时候安全地发布您的副本和/或处理复制的数据。

这是因为底层 PCM 缓冲区可能正在一个单独的 RemoteIO 音频单元线程中更新,该线程在硬实时(马赫内核)上下文中运行。因此,某些音频单元实现可能会忽略所有并发锁,以尝试满足其硬实时完成目标。

于 2021-11-07T20:42:15.833 回答