AVAudioRecorder,AudioKit 问题,iOS 13.1.2

AVAudioRecorder, AudioKit issues , iOS 13.1.2

我不确定发生了什么,但我似乎无法成功初始化 AVAudioRecorder 对象,给定高于 iOS13.0

的设备的某些音频设置

编辑:在下方评论。但这适用于 13.0 和 13.1,但不适用于以下两个补丁,13.1.1 和 13.1.2。 ???

Xcode11

Swift 5

AudioKit pod v4.9(仅供参考,不要认为这是问题所在)

//音频设置

private let audioSettings = [
        AVFormatIDKey : Int(kAudioFormatMPEG4AAC),
        AVSampleRateKey : 44100,
        AVNumberOfChannelsKey : 2,
        AVEncoderAudioQualityKey : AVAudioQuality.medium.rawValue
    ]


do {
     audioRecorder = try AVAudioRecorder(url: actualRecordingPath, settings: audioSettings)
      audioRecorder?.record()
      state = .recording
      try AudioKit.start()
      timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(timerDidUpdate), userInfo: nil, repeats: true)
    } catch let error{
       print("start recording", error.localizedDescription)
       return
      }

具体错误包括:

AVAudioEngine.mm:160 Engine@0x2835411b0: could not initialize, error = -10868

AVAEInternal.h:109 [AVAudioEngineGraph.mm:1397:Initialize: (err = AUGraphParser::InitializeActiveNodesInInputChain(ThisGraph, *GetInputNode())): error -10868 Blockquote

AudioKit+StartStop.swift:restartEngineAfterConfigurationChange(_:):160:error restarting engine after route change

我找到了这个 link:

https://www.osstatus.com/search/results?platform=all&framework=all&search=-10868

它看起来像是不支持某种格式?

有人知道这里发生了什么吗?同样,在 iOS 13.0 上没有错误,只是在 13.0+

上不起作用

尝试将设置更改为:

let settings = [
            AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
            AVSampleRateKey: 12000,
            AVNumberOfChannelsKey: 1,
            AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
        ]

我 运行 遇到与 iOS 13.1.1 和 13.1.2 相同的问题。我一直在我的代码中使用 AudioKit 的 AKNodeRecorder,结果我忘记路由到 AudioKit.output 我的 AKNodeRecorder 正在录制的节点。我所要做的就是在我的节点之后添加一个混音器或增强器,将新节点的增益设置为 0,然后将其路由到输出。

这是损坏的版本:

let mic = AKMicrophone()!
let recorder = AKNodeRecorder(node: mic)!
AudioKit.start()!

这是工作版本:

let mic = AKMicrophone()!
let recorder = AKNodeRecorder(node: mic)!
let recorderGain = AKBooster(mic, gain: 0)
AudioKit.output = recorderGain
AudioKit.start()!

解释为什么需要这样做:AudioKit 从输出节点向后遍历您的处理图。任何未连接到该图的东西都可能无法正确初始化,并且其行为未定义。您可以观察到这种未定义的行为,因为您的代码适用于较旧的 iOS 版本,但不适用于当前版本。

"But AKNodeRecorder is not connected to my graph",你可能会说。原来AKNodeRecorder其实不是一个节点,而是一个tap

一个水龙头可以坐"on top"一个节点。在节点顶部始终只能点击一次。水龙头的其他例子是 AKFFTTap。一般来说,点击会消耗音频,但不会生成任何音频,因此它们不能成为音频图的一部分 - 唯一不能生成任何内容的节点是最终节点,AudioKit.output.

换句话说,您的音频图应如下所示:

 recordingtap
 |
mic -> gain0 -> output

请注意,仅当您不想在输出端听到麦克风的声音时才需要增益。