Загрузка удаленных аудиофайлов и создание одного аудиофайла из всех - PullRequest
0 голосов
/ 26 марта 2020

У меня есть группа рассылки, которая загружает несколько аудиофайлов с удаленного сервера в массив данных. Это все отлично работает. Следующим моим шагом будет создание одного аудиофайла (.wav) из этого массива данных (все исходные файлы .wav).

У меня был небольшой успех с несколькими методами, и некоторые из них могут быть неосновными. подходы:

1) Просто добавьте данные из массива данных в объект NSMutableData и создайте из него файл WAV (не работает). Этот подход был скорее выстрелом в темноте. Не ожидал, что конкатенация объектов данных будет работать ...

2) Передайте массив данных в функцию слияния и начните создавать временные файлы и добавлять их в AVMutableComposition. Кажется, что это не с несколькими ошибками в зависимости от моего подхода. Ниже приведена ошибка:

[AVAssetExportSession setOutputFileType:] Неверный тип выходного файла '

    func merge()
    {
        guard let mainPath = self.baseFile, let singlePath = self.tempFile else { return }

        let documentsDirectory = getDocumentsDirectory()

        let baseAsset = AVAsset(url: mainPath)
        let singleAsset = AVAsset(url: singlePath)

        let mixComposition = AVMutableComposition()

        guard let firstTrack = mixComposition.addMutableTrack(withMediaType: .audio,
                                                              preferredTrackID: Int32(kCMPersistentTrackID_Invalid)) else { return }
        do {
            try firstTrack.insertTimeRange(CMTimeRangeMake(start: CMTime.zero, duration: baseAsset.duration),
                                           of: baseAsset.tracks(withMediaType: .audio)[0],
                                           at: CMTime.zero)
        } catch {
            print("Failed to load first track")
            return
        }

        guard let secondTrack = mixComposition.addMutableTrack(withMediaType: .audio,
                                                               preferredTrackID: Int32(kCMPersistentTrackID_Invalid)) else { return }
        do {
            try secondTrack.insertTimeRange(CMTimeRangeMake(start: CMTime.zero, duration: singleAsset.duration),
                                            of: singleAsset.tracks(withMediaType: .audio)[0],
                                            at: baseAsset.duration)
        } catch {
            print("Failed to load second track")
            return
        }

        let exportSession = AVAssetExportSession(asset: mixComposition, presetName: AVAssetExportPresetHighestQuality)!


        exportSession.outputURL = mainPath

        exportSession.outputFileType = AVFileType.wav

        do { 
            try FileManager.default.removeItem(at: mainPath)
        } catch { print(error.localizedDescription) }

        exportSession.exportAsynchronously(completionHandler: {
            if exportSession.status == .completed {

                DispatchQueue.main.async(execute: {
                    let narrorationDuration = Int(CMTimeGetSeconds(baseAsset.duration))
                    let recordingDuration = Int(CMTimeGetSeconds(singleAsset.duration))

                })
                return
            } else if exportSession.status == .failed {
                print("Loop Export failed - \(String(describing: exportSession.error))")
                //completionHandler(nil)
            }

            //completionHandler(nil)
            return
        })
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...