匹配输入和输出AVAudioEngine的输出硬件设置

时间:2016-01-26 10:28:30

标签: ios swift avfoundation core-audio

我正在尝试使用Core Audio for iOS构建一个非常简单的音频效果链。到目前为止,我已经实现了一个EQ - 压缩 - 限制器链,它在模拟器中运行得非常好。但是,在设备上,由于输入和输出硬件格式明显不匹配,应用程序在将节点连接到 AVAudioEngine 时崩溃。

'com.apple.coreaudio.avfaudio', reason: 'required condition is false:
 IsFormatSampleRateAndChannelCountValid(outputHWFormat)'

举一个基本的例子,我的音频图如下。

Mic -> Limiter -> Main Mixer (and Output)

并使用

填充图表
engine.connect(engine.inputNode!, to: limiter, format: engine.inputNode!.outputFormatForBus(0))
engine.connect(limiter, to: engine.mainMixerNode, format: engine.inputNode!.outputFormatForBus(0))

与上述异常崩溃。如果我在连接混音器时使用限制器的格式

engine.connect(engine.inputNode!, to: limiter, format: engine.inputNode!.outputFormatForBus(0))
engine.connect(limiter, to: engine.mainMixerNode, format: limiter.outputFormatForBus(0))

应用程序因 kAudioUnitErr_FormatNotSupported 错误而崩溃

'com.apple.coreaudio.avfaudio', reason: 'error -10868'

在连接引擎中的音频节点之前,inputNode有1个通道,采样率为44.100Hz,而outputNode有0个通道,采样率为0Hz(使用 outputFormatForBus(0)推导属性)。但这可能是因为没有节点连接到输出混音器?在 AVAudioSession 上设置首选采样率没有任何区别。

我在这里缺少一些东西吗?我有麦克风访问权限(使用 AVAudioSession.sharedInstance()。recordPermission()进行验证),我已将 AVAudioSession 模式设置为记录( AVAudioSession.sharedInstance() .setCategory(AVAudioSessionCategoryRecord))。

限制器是 AVAudioUnitEffect ,初始化如下:

let limiter = AVAudioUnitEffect( audioComponentDescription:
                AudioComponentDescription(
                    componentType: kAudioUnitType_Effect,
                    componentSubType: kAudioUnitSubType_PeakLimiter,
                    componentManufacturer: kAudioUnitManufacturer_Apple,
                    componentFlags: 0,
                    componentFlagsMask: 0) )
engine.attachNode(limiter)

和引擎是一个全局的类变量

var engine = AVAudioEngine()

正如我所说,使用模拟器(和Mac的默认硬件)完全正常,但在iOS8和iOS上的各种iPad上不断崩溃。 iOS9。我有一个超级基本的例子,它只是将麦克风输入提供给播放器到输出混音器

do {
     file = try AVAudioFile(forWriting: NSURL.URLToDocumentsFolderForName(name: "test", WithType type: "caf")!, settings: engine.inputNode!.outputFormatForBus(0).settings)
} catch {}
engine.connect(player, to: engine.mainMixerNode, format: file.processingFormat)

这里inputNode有1个通道和44.100Hz的采样率,而outputNode有2个通道和44.100Hz的采样率,但似乎没有发生不匹配。因此,问题必须是AVAudioUnitEffect连接到输出混音器的方式。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:14)

这取决于您共享的代码之外的一些因素,但您可能使用了错误的AVAudioSession类别。

在一些稍微不同的情况下,我遇到了同样的问题。当我使用AVAudioSessionCategoryRecord作为AVAudioSession类别时,我在尝试连接音频点击时遇到了同样的问题。我不仅收到了这个错误,而且我的AVAudioEngine inputNode显示了一个带有0.0采样率的outputFormat。

将其更改为AVAudioSessionCategoryPlayAndRecord我收到了预期的44.100Hz采样率并解决了问题。