У меня есть группа рассылки, которая загружает несколько аудиофайлов с удаленного сервера в массив данных. Это все отлично работает. Следующим моим шагом будет создание одного аудиофайла (.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
})
}
}