2017-08-11 197 views
3

我有一个关于CoreAudio和AVFoundation的问题。CoreAudio和AVFoundation之间的性能

我使用带有AUGraph和AudioUnit的CoreAudio构建了专业音频应用程序。

我想切换到AVFoundation框架,这似乎是非常棒的。但由于我担心表演,我想多了解一点。

在我的核心音频渲染回调中,我可以用44100kHz的采样率处理512个采样,所以我的回调每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过程产生影响吗?

回答

4

在我使用iOS AVAudioEngine API(iOS 10.3.3)的实验中,我确实发现在AVAudioNode总线上安装一个水龙头不会在我的iPhone 7上提供比4410采样短的缓冲区。这可能是因为AVAudioEngine tap与CoreAudio音频单元回调相比,将缓冲区传递到较低优先级的线程,因此无法像往常一样可靠地进行调用,从而导致更高的延迟。

但是,可以创建一个V3 AUAudioUnit子类,并将接收到的缓冲区(由实例的internalRenderBlock输出)从512配置为短至样本的64个样本。在音频会话上调用setPreferredIOBufferDuration似乎设置首选的AUAudioUnit呈现块缓冲区大小。我发布了一些测试代码(混合Swift 3 plus Objective C),用于创建我认为是低延迟的V3 AUAudioUnit音色生成器子类here。人们需要了解并遵循渲染块内的实时编码限制(无方法调用,锁定,内存分配等),因此块内的音频上下文代码的纯C似乎最好(甚至是强制性的)。

对于延迟相同的低延迟话筒输入,您可以尝试将音频单元子类连接到audioEngine的inputNode,然后在您的单元渲染模块内调用输入的AURenderPullInputBlock。

+0

非常感谢你@ hotpaw2!我总是很感谢你在这里的质量答案。 这就是我正在寻找的,它似乎是一个很好的解决方案。我没有介绍AUAudioUnit的子类。顺便说一句,我们无法从AVAudioPlayer获得音频单元,所以我们非常伤心...所以,如果我理解的很好,以较高的速率获取/更改AVAudioPlayerNode示例的正确方法是:AVAudioPlayerNode - > MyCustomAU(with呈现回调) - > OtherAVAudioUnit。事实上,似乎只用macOS 10.13或更高版本就可以从中获得AudioUnit ... – DEADBEEF

+0

我以前的评论的来源[Apple文档](https://developer.apple.com/documentation/avfoundation/avaudionode/2866396-auaudiounit) – DEADBEEF

+0

AUAudioUnit子类似乎适用于在运行于macOS 10.12下的iOS Simulator内运行的代码。猜猜这可能意味着什么... – hotpaw2

相关问题