gpt4 book ai didi

avfoundation - CoreAudio 和 AVFoundation 之间的性能

转载 作者:行者123 更新时间:2023-12-03 13:54:56 39 4
gpt4 key购买 nike

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

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

我想切换到看起来非常棒的 AVFoundation 框架。但是因为我担心性能,所以我想多了解一点。

在我的核心音频渲染回调中,我可以以 44100kHz 的采样率处理 512 个样本,所以我的回调每 10 毫秒调用一次,我认为它可以很容易地更快(对吗?)。

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

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

不会对实时DSP处理产生影响吗?

最佳答案

在我使用 iOS AVAudioEngine API (iOS 10.3.3) 的实验中,我确实发现在 AVAudioNode 总线上安装一个 Tap 不会在我的 iPhone 7 上提供短于 4410 个样本的缓冲区。这可能是因为 AVAudioEngine tap 将缓冲区提供给一个线程的优先级低于 CoreAudio 音频单元回调,因此无法经常可靠地调用,从而导致更高的延迟。

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

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

关于avfoundation - CoreAudio 和 AVFoundation 之间的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45644079/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com