Reputation: 101
I try to merge wavs into one file WAV. But if I set export m4a(AAC) all is ok all is merging fine. But if wav it works only with one file composition. If few wavs , wav type become incompatible.
That function
func mergeWAVs(audioFileUrls: Array<URL>,format:String,prefixFileName:String) -> URL{
let composition = AVMutableComposition()
var outURL:URL? = nil
var fileName:String
var fileType:AVFileType
print("START MERGING")
self.progressStatus = "Converting.."
switch format{
case "AAC":
print("aac")
fileName = "\(prefixFileName).m4a"
fileType = AVFileType.m4a
default:
print("wav")
fileName = "\(prefixFileName).wav"
fileType = AVFileType.wav
}
let fileManager = FileManager.default
do {
let documentDirectory = try fileManager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor:nil, create:false)
try FileManager.default.createDirectory(atPath: documentDirectory.path, withIntermediateDirectories: true, attributes: nil)
outURL = documentDirectory.appendingPathComponent(fileName)
}
catch {
print(error)
}
for i in 0 ..< audioFileUrls.count
{
let compositionAudioTrack :AVMutableCompositionTrack = composition.addMutableTrack(withMediaType: AVMediaType.audio, preferredTrackID: CMPersistentTrackID())!
let asset = AVURLAsset(url: audioFileUrls[i])
let track = asset.tracks(withMediaType: AVMediaType.audio)[0]
let timeRange = CMTimeRange(start: CMTimeMake(value: 0, timescale: 600), duration: track.timeRange.duration)
try! compositionAudioTrack.insertTimeRange(timeRange, of: track, at: composition.duration)
}
var assetExport:AVAssetExportSession
switch format{
case "AAC":
print("set format aac")
assetExport = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetAppleM4A)!
default:
print("set def format wav")
assetExport = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetPassthrough)!
}
assetExport.determineCompatibleFileTypes { (fileTypes) in
if fileTypes.contains(.wav)
{
print("WAV TYPE EXISTS")
}
}
assetExport.outputFileType = fileType
assetExport.outputURL = outURL
assetExport.exportAsynchronously(completionHandler:
{ [self] in
switch assetExport.status
{
case AVAssetExportSession.Status.failed:
print("failed \(String(describing: assetExport.error))")
self.progressStatus = String(describing: assetExport.error)
case AVAssetExportSession.Status.cancelled:
print("cancelled \(String(describing: assetExport.error))")
self.progressStatus = String(describing: assetExport.error)
case AVAssetExportSession.Status.unknown:
self.progressStatus = String(describing: assetExport.error)
print("unknown\(String(describing: assetExport.error))")
case AVAssetExportSession.Status.waiting:
print("waiting\(String(describing: assetExport.error))")
case AVAssetExportSession.Status.exporting:
print("exporting\(String(describing: assetExport.error))")
default:
//print("Audio Concatenation Complete")
cleanUpTMPFiles()
//COMPLETE SIGNAL
shareFileURL = outURL
self.progressStatus = "Complete"
self.progress = -1 //SET SIGNAL TO COMPLETE IN VIEW
//COMPLETE SIGNAL
}
})
return outURL!
}
if I try to run this code log:
LOG:
START MERGING
wav
set def format wav
failed Optional(Error Domain=AVFoundationErrorDomain Code=-11838 "Operation Stopped" UserInfo={NSLocalizedFailureReason=The operation is not supported for this media., NSLocalizedDescription=Operation Stopped, NSUnderlyingError=0x283128570 {Error Domain=NSOSStatusErrorDomain Code=-16976 "(null)"}})
ITS OK if only ONE file in composition. But if two determineCompatibleFileTypes become not
assetExport.determineCompatibleFileTypes { (fileTypes) in
if fileTypes.contains(.wav)
{
print("WAV TYPE EXISTS")
// wav not in CompatibleFileTypes if few wavs to merge
}
}
UPDATE: So strange I found if two files determineCompatibleFileTypes fileTypes returns only video formats:
[__C.AVFileType(_rawValue: com.apple.m4v-video), __C.AVFileType(_rawValue: com.apple.quicktime-movie), __C.AVFileType(_rawValue: public.3gpp), __C.AVFileType(_rawValue: public.mpeg-4)]
But if only one wav in merge then return audio and video formats:
determineCompatibleFileTypes fileTypes
[__C.AVFileType(_rawValue: com.apple.coreaudio-format), __C.AVFileType(_rawValue: com.apple.m4a-audio), __C.AVFileType(_rawValue: com.apple.m4v-video), __C.AVFileType(_rawValue: com.apple.quicktime-movie), __C.AVFileType(_rawValue: com.microsoft.waveform-audio), __C.AVFileType(_rawValue: public.3gpp), __C.AVFileType(_rawValue: public.aifc-audio), __C.AVFileType(_rawValue: public.aiff-audio), __C.AVFileType(_rawValue: public.mpeg-4)]
//
UPDATE: I also tried merge wav files created in audio editor software with different parameters bits per channel and discretisation... Same result...no luck
Upvotes: 0
Views: 45