当前位置 : 主页 > 网络安全 > 测试自动化 >

CoreAudio和AVFoundation之间的性能

来源:互联网 收集:自由互联 发布时间:2021-06-22
我有一个关于CoreAudio和AVFoundation的问题. 我使用CoreAudio和AUGraph和AudioUnit构建了一个专业音频应用程序. 我想切换到似乎非常棒的AVFoundation框架.但是,由于我担心性能,我想更多地了解它.
我有一个关于CoreAudio和AVFoundation的问题.

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

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

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

现在在AVFoundation中,渲染回调是AVAudioNode的Tap.我在评论中读到,bufferSize参数是示例帧中传入缓冲区的请求大小.支持的范围是[100,400] ms.那么这是否意味着我将无法在每次通话时处理少于4410个样本?

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

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

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

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

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

网友评论