Search code examples
swiftavfoundationavaudiorecorder

AVAudioRecorder never records


I am using an AVAudioRecorder to record human voice. My code is as follows:

// Property of Class
var recorder:AVAudioRecorder?

func recordButtonTapped() {
    let audioSession = AVAudioSession.sharedInstance()
    do {
        try audioSession.setCategory(AVAudioSessionCategoryRecord)
        try audioSession.setActive(true)
        if audioSession.recordPermission() != .granted {
            audioSession.requestRecordPermission({ (success) in
                self.startRecording()
            })
        }
        else {
            self.startRecording()
        }

    } catch {
        print("Unable To Set Category")
    }
}

func startRecording() {
    // libraryPathWith(media) just gets the path to the documents directory
    // Like so: Documents/MediaLibrary/Audio/<mediaID>.<mediaExtension>
    if let path = MMFileManager.libraryPathWith(media: self.media) {
        isRecording = true
        do {
            let settings = [
                AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
                AVSampleRateKey: 44100,
                AVNumberOfChannelsKey: 1,
                AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
            ]

            recorder = try AVAudioRecorder(url: path, settings: settings)

            recorder?.delegate = self

            if recorder!.prepareToRecord() {
                recorder?.record()
            }
        }
        catch {
            isRecording = false
        }
    }
}

func stopRecording() {
    self.recordingLabel.text = "Recording Complete"
    self.recordingLabel.textColor = UIColor.white
    if let rec = recorder {
        rec.stop()
        recorder = nil
    }
    isRecording = false
}

AVAudioRecorderDelegate

func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {
    print("RECORDED AUDIO SUCCESSFULLY \(flag)")
}
func audioRecorderEncodeErrorDidOccur(_ recorder: AVAudioRecorder, error: Error?) {
    print("AUDIO RECORDER ERROR \(error?.localizedDescription)")
}

After I call stop on the AVAudioRecorder the audioRecorderEncodeErrorDidOccur function never gets called, but the audioRecorderDidFinishRecording function does but the flag is always false. It prints out "RECORDED AUDIO SUCCESSFULLY false"

QUESTION

When I record using the code above I does save a file to my documents directory at the location specified. But this file is not something that I can play. It writes a text file, not an audio file as I specify the extension to be .aac.

Why does the AVAudioRecorder not record audio? And how do I get it to do so?


Solution

  • The issue was with the line in the stopRecording() function. Below the call to stop() the recorder I am immediately assigning the AVAudioRecorder instance to nil. This deallocates and ends the AVAudioRecorder before the post processing to create the authentic .aac file can be completed.