AVAudioRecorder, проблемы AudioKit, iOS 13.1.2 - PullRequest
2 голосов
/ 02 октября 2019

Я не уверен, что происходит, но я не могу успешно инициализировать объект AVAudioRecorder, учитывая определенные настройки звука для устройства выше iOS 13.0

РЕДАКТИРОВАТЬ: прокомментировано ниже. но это работает на 13.0 и 13.1, но не на двух следующих патчах, 13.1.1 и 13.1.2. ???

Xcode 11

Swift 5

AudioKit pod v4.9 (просто к вашему сведению, не думаю, что это проблема)

// audioНастройки

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 + StartSf:): 160: ошибка перезапуска двигателя после изменения маршрута

Мне удалось найти эту ссылку:

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

и похоже, что это форматне поддерживается?

Кто-нибудь понял, что здесь происходит? Опять же, нет ошибки на iOS 13.0, просто не работает на 13.0 +

Ответы [ 2 ]

2 голосов
/ 04 октября 2019

Я столкнулся с той же проблемой с iOS 13.1.1 и 13.1.2. Я использовал AKNodeRecorder AudioKit в своем коде, и оказалось, что я забыл перенаправить на 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 на самом деле не узел, а отвод.

Отвод может находиться «сверху» узла. Всегда может быть только одно нажатие на вершину узла. Другими примерами кранов являются AKFFTTap. Вообще говоря, отводы потребляют аудио, но не генерируют аудио, и поэтому они не могут быть частью звукового графа - единственным узлом, который ничего не может сгенерировать, является конечный узел, AudioKit.output.

В другомДругими словами, ваш аудио график должен выглядеть следующим образом:

 recordingtap
 |
mic -> gain0 -> output

Обратите внимание, что усиление необходимо только в том случае, если вы не хотите слышать ваш микрофон на выходе.

0 голосов
/ 02 октября 2019

Попробуйте изменить настройку на это:

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