IOS / Swift / AVFoundation: сбой при объявлении audioEngine.inputNode внутри оператора защиты - PullRequest
0 голосов
/ 19 сентября 2018

Я новичок в Swift и пытаюсь реализовать audioEngine для микрофона для записи.

В какой-то момент я объявляю inputNode (микрофон) с помощью оператора:

print("before input node")
guard let inputNode = audioEngine.inputNode else {
            fatalError("Audio engine has no input node")
        }
print("after check of input node")

При пошаговом выполнении кода в отладчике во время выполнения возникает исключение во время оператора guard let inputNode.Код печатает "before inputNode", но никогда не печатает строки fatalError или "after check"

У меня было впечатление, что оператор защиты в Swift обнаруживает нулевое значение, таким образом избегая сбоя, но этов этом случае не происходит.

Буду признателен за любые предположения о том, что может пойти не так.

Для справки, до этого момента в методе следующий код выполняется без проблем:

public fund startRecording()
if recognitionTask != nil {
            recognitionTask?.cancel()
            recognitionTask = nil
        }

        let audioSession = AVAudioSession.sharedInstance()
        do {
            try audioSession.setCategory(AVAudioSessionCategoryRecord)
            try audioSession.setMode(AVAudioSessionModeMeasurement)
            try audioSession.setActive(true, with: .notifyOthersOnDeactivation)
        } catch {
            print("audioSession properties weren't set because of an error.")
        }

        recognitionRequest = SFSpeechAudioBufferRecognitionRequest()

Редактировать:

Вот дополнительный код, относящийся к движку:

объявление в viewdidload

 private let audioEngine = AVAudioEngine()

И попытаться запустить его позже в методе startRecordingссылка выше:

let recordingFormat = inputNode.outputFormat(forBus: 0)
        inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer, when) in
            self.recognitionRequest?.append(buffer)
        }

        audioEngine.prepare()

        do {
            try audioEngine.start()
        } catch {
            print("audioEngine couldn't start because of an error.")
        }       
...