CoreAudio和AVFoundation之间的性能

DEA*_*EEF 5 core-audio avfoundation

我有一个关于CoreAudio和AVFoundation的问题.

我使用CoreAudio和AUGraph和AudioUnit构建了一个专业音频应用程序.

我想切换到似乎非常棒的AVFoundation框架.但是,由于我担心性能,我想更多地了解它.

在我的核心音频渲染回调中,我可以处理512个样本,采样率为44100kHz,所以我的回调每隔10ms调用一次,我认为它可以很快变得更快(我是对的吗?).

现在在AVFoundation中,渲染回调是AVAudioNode的Tap.我在评论中读到bufferSize参数是the requested size of the incoming buffers in sample frames. Supported range is [100, 400] ms.这样的,这是否意味着我将无法在每次调用时处理少于4410个样本?

限制是否来自Objective-C约束(消息调用,锁定等)?

它不会对实时DSP过程产生影响吗?

hot*_*aw2 7

在我使用iOS AVAudioEngine API(iOS 10.3.3)的实验中,我确实发现在AVAudioNode总线上安装水龙头不会在我的iPhone 7上提供短于4410个样本的缓冲区.这可能是因为AVAudioEngine水龙头为优先级较低的线程比CoreAudio Audio Unit回调,因此无法经常可靠地调用,从而导致更高的延迟.

但是,可以创建一个V3 AUAudioUnit子类,其中接收的缓冲区(由实例的internalRenderBlock用于输出)在iPhone 7上配置为512到最短64个样本.在音频会话上调用setPreferredIOBufferDuration似乎设置首选的AUAudioUnit渲染块缓冲区大小.我贴我的一些测试代码(混合斯威夫特3加目标C)创造什么,我认为是一个工作低延迟V3 AUAudioUnit音调发生器子类在这里.人们确实需要理解并遵循渲染块内的实时编码限制(没有方法调用,锁定,内存分配等),因此块内音频上下文代码的普通C似乎是最好的(甚至可能是强制性的).

对于具有相同短缓冲区的低延迟麦克风输入,您可以尝试将音频单元子类连接到audioEngine的inputNode,然后在单元渲染块内调用输入的AURenderPullInputBlock.