IOS / Swift / AVFoundation: Crash en la declaración audioEngine.inputNode dentro de la declaración de guardia

votos
0

Soy nuevo en Swift y tratando de poner en práctica el AUDIOENGINE para un micrófono con el fin de grabar.

En un momento me declaro el inputNode (micrófono) con la declaración:

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

Recorrer el código en el depurador, se produce una excepción en tiempo de ejecución en el transcurso de la guard let inputNodedeclaración. La impresora de código before inputNode pero nunca imprime la fatalErroro las after checklíneas

Yo tenía la impresión de que una declaración de guardia en Swift detecta un valor nulo evitando con ello un accidente, pero que no está ocurriendo en este caso.

Apreciaría cualquier sugerencia sobre lo que podría ir mal.

Para referencia, antes de este punto en el método el siguiente código se ejecuta sin problema:

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()

Editar:

Aquí está el código adicional relacionada con el motor:

declaración en viewDidLoad

 private let audioEngine = AVAudioEngine()

E intente iniciar más tarde en el método startRecording referencia más arriba:

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.)
        }       
Publicado el 19/09/2018 a las 17:09
fuente por usuario
En otros idiomas...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more