D P
D P

Reputation: 101

AVAssetExportSession fail with wav

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

Answers (0)

Related Questions