ios - append or concatenate audio files in swift -
hi want append voice files.
i'm recording voice avaudiorecorder, play recording need call "stop", after playing want continue record. native ios voice memo app.
should use avmutablecompositiontrack , how do in swift? thanks!
if looking pause recording , continue later can use avaudiorecorder's pause() function rather stop() , continue recording when use play() again.
however, if looking concatenate audio files, can this:
func concatenatefiles(audiofiles: [nsurl], completion: (concatenatedfile: nsurl?) -> ()) { guard audiofiles.count > 0 else { completion(concatenatedfile: nil) return } if audiofiles.count == 1 { completion(concatenatedfile: audiofiles.first) return } // concatenate audio files 1 file var nextclipstarttime = kcmtimezero let composition = avmutablecomposition() let track = composition.addmutabletrackwithmediatype(avmediatypeaudio, preferredtrackid: kcmpersistenttrackid_invalid) // add each track recording in audiofiles { let asset = avurlasset(url: nsurl(fileurlwithpath: recording.path!), options: nil) if let assettrack = asset.trackswithmediatype(avmediatypeaudio).first { let timerange = cmtimerange(start: kcmtimezero, duration: asset.duration) { try track.inserttimerange(timerange, oftrack: assettrack, attime: nextclipstarttime) nextclipstarttime = cmtimeadd(nextclipstarttime, timerange.duration) } catch { print("error concatenating file - \(error)") completion(concatenatedfile: nil) return } } } // export new file if let exportsession = avassetexportsession(asset: composition, presetname: avassetexportpresetpassthrough) { let paths = nssearchpathfordirectoriesindomains(.documentdirectory, .userdomainmask, true) let documents = nsurl(string: paths.first!) if let fileurl = documents?.urlbyappendingpathcomponent("file_name.caf") { // remove existing file { try nsfilemanager.defaultmanager().removeitematpath(fileurl.path!) print("removed \(fileurl)") } catch { print("could not remove file - \(error)") } // configure export session output exportsession.outputurl = nsurl.fileurlwithpath(fileurl.path!) exportsession.outputfiletype = avfiletypecoreaudioformat // perform export exportsession.exportasynchronouslywithcompletionhandler() { handler -> void in if exportsession.status == .completed { print("export complete") dispatch_async(dispatch_get_main_queue(), { completion(file: fileurl) }) return } else if exportsession.status == .failed { print("export failed - \(exportsession.error)") } completion(concatenatedfile: nil) return } } } }
Comments
Post a Comment