【问题标题】:AVAudioRecorder, AudioKit issues , iOS 13.1.2AVAudioRecorder,AudioKit 问题,iOS 13.1.2
【发布时间】:2019-10-01 22:27:33
【问题描述】:

我不确定发生了什么,但鉴于 iOS 13.0 以上设备的某些音频设置,我似乎无法成功初始化 AVAudioRecorder 对象

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

Xcode 11

斯威夫特 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: 无法初始化,错误 = -10868

AVAEInternal.h:109 [AVAudioEngineGraph.mm:1397:Initialize: (err = AUGraphParser::InitializeActiveNodesInInputChain(ThisGraph, *GetInputNode())): 错误 -10868 块引用

AudioKit+StartStop.swift:restartEngineAfterConfigurationChange(_:):160:error 更改路线后重新启动引擎

我找到了这个链接:

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

它看起来可能不支持格式?

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

【问题讨论】:

    标签: ios swift ios13 avaudiorecorder audiokit


    【解决方案1】:

    我在 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 版本,但不适用于当前版本。

    “但是 AKNodeRecorder 没有连接到我的图表”,你可能会说。原来AKNodeRecorder其实并不是一个节点,而是一个tap。

    水龙头可以位于节点的“顶部”。一个节点上总是只能点击一次。水龙头的其他示例是AKFFTTap。一般来说,点击会消耗音频,但不会生成任何音频,因此它们不能成为音频图的一部分——唯一不能生成任何东西的节点是最终节点AudioKit.output

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

     recordingtap
     |
    mic -> gain0 -> output
    

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

    【讨论】:

    • 感谢您的评论!我的问题是 - 为什么它会停止工作,就像我在 13.1.1 和 13.1.2 中的方式一样(它在 13.1 中工作)?我没有使用 AKNodeRecorder。我正在使用 AKNodeOutputPlot。在此之前的代码中,我没有将输出设置为任何位置。
    • "在之前的代码中,我没有将输出设置为任何内容。"这正是问题所在。正如我在评论中所写,这会导致未定义的行为。当您调用AudioKit.start() 时,AudioKit 将遍历图并确保所有节点都配置一致。如果它们没有连接,您将依赖每个节点的默认配置,这可能会或可能不会工作,并且当然可能会发生变化,即使在次要版本之间也是如此,因为无法保证默认配置。如果您使用 AudioKit,我建议您完全使用它,而不是依赖它和原始 AVFoundation 代码的混合。
    • 请注意,当您将AVAudioRecorderAudioKit 结合使用时,AudioKit 将尝试配置您的音频系统的某些部分,但随后AVAudioRecorder 可能会对其部分进行不同的配置。因此,即使它不是一个节点,因为它不是一个 AudioKit 类,它仍然没有连接到图形,因此 AudioKit 无法以所有部件相互配合的方式来配置你的音频系统。这就是为什么我建议对所有部分都使用 AudioKit。
    • Thomas - 非常感谢您的帮助!看起来它奏效了。令人费解的是它以前完全可以工作 - 与设置输出一样重要,它一直工作到 iOS 13.1 但不是 13.1.x。真的很奇怪。所以你是说你可以只使用 AudioKit 来录制和播放而不是同时使用?
    • 是的,当然。 AudioKit 将为您处理录音。请记住:每个节点最多点击一次(AKNodeRecorder 是一次点击),所有节点都必须连接到输出(直接或通过其他节点),即使您不想听到它们(只是在两者之间增加增益并将其设置为 0)。
    【解决方案2】:

    尝试将设置更改为:

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

    【讨论】:

    • 就像添加的评论一样。这适用于 13.1 上的所有设备,但不适用于 13.1.1 和 13.1.2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多