iOS - сбой AudioKit при получении телефонного звонка - PullRequest
3 голосов
/ 24 января 2020

AudioKit 4.9.3 iOS 11 +

Я работаю над проектом, в котором пользователь записывает на устройство с помощью микрофона и продолжает запись, даже если приложение находится в фоновом режиме. Это работает нормально, но при получении телефонного звонка я получаю ошибку AudioKit. Я предполагаю, что это как-то связано с тем, что телефон захватывает mi c или что-то в этом роде. вот ошибка:

[avae] AVAEInternal.h: 109
[AVAudioEngineGraph.mm:1544:Start: (err = PerformCommand (* ioNode, kAUStartIO, NULL, 0)): ошибка 561017449 AudioKit + StartStop.swift: restartEngineAfterRouteChange (_ :): 198: ошибка перезапуска механизма после изменения маршрута

, в основном все, что у меня записано, до тех пор, пока эта точка не будет потеряна.

вот мой настроенный код AudioKit:

func configureAudioKit() {
        AKSettings.audioInputEnabled = true
        AKSettings.defaultToSpeaker = true
        do {
            try try audioSession.setCategory((AVAudioSession.Category.playAndRecord), options: AVAudioSession.CategoryOptions.mixWithOthers)
            try audioSession.setActive(true)
            audioSession.requestRecordPermission({ allowed in
                DispatchQueue.main.async {
                    if allowed {
                        print("Audio recording session allowed")
                        self.configureAudioKitSession()
                    } else {
                        print("Audio recoding session not allowed")
                    }
                }
            })
        } catch let error{
            print("Audio recoding session not allowed: \(error.localizedDescription)")
        }
    }


func configureAudioKitSession() {
        isMicPresent = AVAudioSession.sharedInstance().isInputAvailable
        if !isMicPresent {
            return
        }
        print("mic present and configuring audio session")
        mic = AKMicrophone()
        do{
        let _ = try AKNodeRecorder(node: mic)
        let recorderGain = AKBooster(mic, gain: 0)
        AudioKit.output = recorderGain
        //try AudioKit.start()
        }
        catch let error{
            print("configure audioKit error: ", error)
        }
}

и при нажатии на код кнопки записи:

    do {
         audioRecorder = try AVAudioRecorder(url: actualRecordingPath, settings: audioSettings)
         audioRecorder?.record()
         //print("Recording: \(isRecording)")
         do{
           try AudioKit.start()
          }
          catch let error{
            print("Cannot start AudioKit", error.localizedDescription)
          }
}

Текущие настройки звука:

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

Что я могу сделать, чтобы обеспечить правильную запись даже при получении телефонного звонка? Ошибка происходит, как только вы получаете звонок - хотите ли вы ответить на него или отклонить.

Есть мысли?

Ответы [ 2 ]

1 голос
/ 26 января 2020

Я сделал работу в этой области, боюсь, вы не можете получить доступ к микрофону (ам) во время разговора или VOIP-звонка.

Это базовая c мера конфиденциальности, которая применяется iOS по очевидным причинам.

1 голос
/ 26 января 2020

AudioKit обрабатывает только основную c обработку изменения маршрута для приложения воспроизведения аудио. Мы обнаружили, что когда приложение становится достаточно сложным, платформа не может эффективно предопределить соответствующий порядок действий при возникновении прерываний. Поэтому я бы предложил отключить обработку изменения маршрута AudioKit и самому ответить на уведомления.

Кроме того, я бы добавил код активации AudioKit в кнопку.

...