我最近努力让AVMutableComposition在我的合成器应用程序中运行。我在没有Audiokit的情况下实现了类似下面的功能,它工作得很好。但是,当我运行下面的函数时,我只能在输出的AKAudioFile中的文件arrray中的第一个文件。这是如何复制AKAudioFiles或AVMutableComposition如何工作的问题?
private func createCombinedRecordingFrom(_ files: [AKAudioFile], completion: @escaping (AKAudioFile?) -> ()) {
let composition = AVMutableComposition()
for file in files {
let asset = file.avAsset
let timeRange = CMTimeRange(start: kCMTimeZero, duration: asset.duration)
let track = composition.addMutableTrack(withMediaType: .audio,
preferredTrackID: kCMPersistentTrackID_Invalid)
do {
try track?.insertTimeRange(timeRange, of: asset.tracks[0], at: kCMTimeZero)
} catch {
print(error.localizedDescription)
completion(nil)
}
}
let assetExport = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetAppleM4A)!
assetExport.audioTimePitchAlgorithm = .spectral
assetExport.outputFileType = .m4a
let temporaryURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(UUID().uuidString).appendingPathExtension("m4a")
assetExport.outputURL = temporaryURL
assetExport.exportAsynchronously() {
do {
let audioFile = try AKAudioFile(forReading: temporaryURL)
completion(audioFile)
} catch {
print(error.localizedDescription)
completion(nil)
}
}
}