gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 05:23:40 24 4
gpt4 key购买 nike

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

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

举个基本的例子,我的Audio Graph如下。

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 个 channel 和 44.100Hz 的采样率,而 outputNode 有 0 个 channel 和 0Hz 的采样率(使用 outputFormatForBus(0) 推导)属性(property))。但这可能是因为还没有节点连接到输出混音器?在 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)

engine 是一个全局类变量

var engine = AVAudioEngine()

正如我所说,使用模拟器(和 Mac 的默认硬件)可以完美运行,但在 iOS8 和 iOS9 上的各种 iPad 上不断崩溃。我有一个 super 基本的例子,它简单地将麦克风输入馈送到播放器到输出混音器

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 个 channel 和 44.100Hz 采样率,而 outputNode 有 2 个 channel 和 44.100Hz 采样率,但似乎没有发生不匹配。因此,问题一定是 AVAudioUnitEffect 连接到输出混音器的方式。

如有任何帮助,我们将不胜感激。

最佳答案

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

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

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

关于ios - 匹配 AVAudioEngine 的输入和输出硬件设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35011702/

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