Ошибки AVAssetExportSession при экспорте .m4a - PullRequest
0 голосов
/ 21 апреля 2020

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

ошибка домена ошибки = код AVFoundationErrorDomain = -11800 «Операция не может быть завершена» UserInfo = {NSUnderlyingError = 0x600001635aa0 {ошибка домена = код NSOSStatusErrorDomain = -16979 «(ноль)» }, NSLocalizedFailureReason = Произошла неизвестная ошибка (-16979)

Вот мои настройки

var recordingURL: URL!
let fileName = "\(NSUUID().uuidString).m4a"

func startRecording() {
 recordingURL = FileManager.getDocumentsDirectory().appendingPathComponent(fileName)
    let settings = [
        AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
        AVSampleRateKey: 12000,
        AVNumberOfChannelsKey: 1,
        AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
    ]
    do {
        audioRecorder = try AVAudioRecorder(url: recordingURL, settings:       settings)
        audioRecorder.delegate = self
        audioRecorder.record()
    } catch {
        finishRecording(success: false)
    }
}

func saveAudiofile() {
    let asset = AVAsset(url: recordingURL)
    exportAsset(asset) 
}

func exportAsset(_ asset: AVAsset) {
    let documentsDirectory = FileManager.getDocumentsDirectory()
    let fileURL = documentsDirectory.appendingPathComponent(fileName)
    print("Here is the file Path \(fileURL.path)")

    let filePath = fileURL.path
    let fileManager = FileManager.default
    if fileManager.fileExists(atPath: filePath) {
        do {
            try fileManager.removeItem(atPath: filePath)
        }
        catch {
            print("Couldn't remove existing destination file: \(error)")
        }
    }
    print("creating export session")

    if let exporter = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetAppleM4A) {
        exporter.outputFileType = AVFileType.m4a
        exporter.outputURL = fileURL


        if wastrimmed {
            let start = CMTime(seconds: startTime, preferredTimescale: 1)
            let stop = CMTime(seconds: endTime, preferredTimescale: 1)
            exporter.timeRange = CMTimeRangeFromTimeToTime(start: start, end: stop)
        } else {
            let startTime = CMTime(seconds: 0, preferredTimescale: 1)
            let endTime = CMTime(seconds: recordingSnapshot, preferredTimescale: 1)
            exporter.timeRange = CMTimeRangeFromTimeToTime(start: startTime, end: endTime)
            print("The duration is: \(exporter.timeRange.duration)")
        }

        let trimmedDuration = CMTimeGetSeconds(exporter.timeRange.duration)

        if trimmedDuration < 10.0 {
            print("Audio is not long enough: \(trimmedDuration)")
            return
        }

        exporter.exportAsynchronously(completionHandler: {
            switch exporter.status {
            case AVAssetExportSessionStatus.failed:
                print("failed \(exporter.error!)")
            case AVAssetExportSessionStatus.cancelled:
                print("cancelled \(exporter.error!)")
            case AVAssetExportSessionStatus.unknown:
                print("unknown\(exporter.error!)")
            case AVAssetExportSessionStatus.waiting:
                print("waiting\(exporter.error!)")
            case AVAssetExportSessionStatus.exporting:
                print("exporting\(exporter.error!)")
            default:
                print("complete")
                User.draftEpisodes?.append(self.fileName)
            }
        })
    } else {
        print("cannot create AVAssetExportSession for asset \(asset)")
    }
}

Вывод:

Успешная запись Вот файл Path / Users / waylansands / Library / Developer / CoreSimulator / Devices / E919B236-0B88-4CA4-A7EF-03E668AE716E / данные / Контейнеры / Data / Application / E6410C85-49EF-4F65-83D2-C470C166BBAE / Документы / 16E8D6E6-DB81-48DA-8766-7A60981031E C .m4a

создание сеанса экспорта 2020-04-20 20: 53: 00.218660 + 1000 Dune [4381: 496890] CMTimeMakeWithSeconds (11,173 секунды, временной масштаб 1): предупреждение: ошибка -0,173 внесена из-за очень нижняя шкала времени

Продолжительность: CMTime (значение: 11, шкала времени: 1, флаги: __ C .CMTimeFlags (rawValue: 3), эпоха: 0)

ошибка Домен = AVFoundationErrorDom ain Code = -11800 "Операция не может быть завершена" UserInfo = {NSUnderlyingError = 0x600001635aa0 {Error Domain = NSOSStatusErrorDomain Code = -16979 "(null)"}, NSLocalizedFailureReason = Произошла неизвестная ошибка (-16979), NSURL = файл: /// Пользователи / waylansands / Library / Developer / CoreSimulator / Devices / E919B236-0B88-4CA4-A7EF-03E668AE716E / данные / Контейнеры / Data / Application / E6410C85-49EF-4F65-83D2-C470C166BBAE / Документы / 16E8D6E6-DB81-48DA -8766-7A60981031E C .m4a, NSLocalizedDescription = Операция не может быть завершена}

1 Ответ

0 голосов
/ 21 апреля 2020

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

recordingURL = FileManager.getDocumentsDirectory (). AppendingPathComponent (fileName + ".m4a")

...