AVAudioRecorder никогда не записывает

Я использую AVAudioRecorder записать человеческий голос. Мой код выглядит следующим образом:

// 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)")
}

После того, как я вызываю стоп на AVAudioRecorder, audioRecorderEncodeErrorDidOccur функция никогда не вызывается, но audioRecorderDidFinishRecording функция делает но flag всегда false, Распечатывает "RECORDED AUDIO SUCCESSFULLY false"

ВОПРОС

Когда я делаю запись, используя приведенный выше код, я сохраняю файл в папку с документами в указанном месте. Но этот файл не то, что я могу играть. Он пишет текстовый файл, а не аудиофайл, так как я указываю расширение, которое будет .aac,

Почему AVAudioRecorder не записывать аудио? И как мне заставить это сделать?

4 ответа

Решение

Проблема была с линией в stopRecording() функция. Ниже звонка stop() рекордер я сразу назначаю AVAudioRecorder экземпляр для nil, Это освобождает и заканчивает AVAudioRecorder перед постобработкой для создания аутентичного .aac файл может быть завершен.

Если вы убедились, что ваш URL имеет расширение "aac", то я подозреваю, что вы просто забыли вызвать stop() на вашем рекордере. Это приводит к незавершенному файлу.

Также напечатайте свои ошибки в блоке catch.

do{
    try throwingFunc()
} catch {
    print(error)
}

Вот как я это сделал, первый импорт

AVFoundation

и добавьте AVAudioRecorderDelegate в свой ViewController:

class RecordViewController: UIViewController, AVAudioRecorderDelegate

затем создайте глобальный экземпляр AVAudioRecorder:

var audioRecorder : AVAudioRecorder!

Затем я создал кнопку записи, которая начинает запись:

@IBAction func playButton(_ sender: Any) {

    let dirPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
    let recordingName = "voiceRecording.wav"
    let pathArray = [dirPath, recordingName]
    let filePath = URL(string: pathArray.joined(separator: "/"))

    let session = AVAudioSession.sharedInstance()
    try! session.setCategory(AVAudioSessionCategoryPlayAndRecord, with: .defaultToSpeaker)

    try! audioRecorder = AVAudioRecorder(url: filePath!, settings: [:])
    audioRecorder.delegate = self
    audioRecorder.isMeteringEnabled = true
    audioRecorder.prepareToRecord()
    audioRecorder.record()
}

dirPath находит каталог, в котором будет храниться изображение.

recordingName установит имя фактически записанного файла

filepath объединяет каталог и recordingName для конечного местоположения

Остальные в значительной степени говорят сами за себя.

Затем создайте кнопку паузы, которая проще:

@IBAction func pauseButton(_ sender: Any) {

    audioRecorder.stop()
    let audioSession = AVAudioSession.sharedInstance()
    try! audioSession.setActive(false)
}

Это должно решить, как вы записываете аудио.

Возникла та же проблема. Это произошло потому, что не удалось создать файл, когда я звоню.

      [_audioRecorder prepareToRecord];

Исправьте это, создав пустой файл вручную.

      // Fix strange prepareToRecord Glich 
            NSFileManager *fileManager = [NSFileManager defaultManager];
            Boolean isFileCreated = [fileManager createFileAtPath:outputFileURL.path contents:NULL attributes:NULL];
Другие вопросы по тегам