如何合并两个MP3文件的iOS?

我有一个用户在我的应用程序录制和另一个mp3文件,我希望用户能够将这两个文件导出为一个,这意味着这两个文件将以某种方式合并或放在彼此之上。

如果没有理解,两个mp3文件将被同时播放,就像任何应用程序,用户可以录制说,一首歌,一个工具。

录音和乐器是两个独立的MP3文件,需要导出为一个。

我怎么去做这个? 从我读到的,我找不到解决scheme。 我在连接两个audio文件时看到了很多,但我不想让他们一个接一个地播放,而是同时播放。

谢谢。

编辑:我知道这是迟到,但万一有人绊倒了这一点,并正在寻找示例代码,这是在我的答案在这里: 我如何重叠audio文件,并在iPhone Xcode组合?

如果我得到你的权利,你要求一个audio混合器function。 这不是一个微不足道的任务。 看看Core Audio 。 一本好书就是这一本 。 一种解决scheme是创build一个无GUI的audio单元(混音器单元),播放,混合和渲染两个信号(mp3)。

除了编程方面外,这里还有一个audio工程方面:你应该注意信号的电平。 想象一下你有2个相同的MP3在0dB的水平。 如果你总结,你的水平将是+ 3dB。 这在数字世界中是不存在的(0dB是最大的)。 正因为如此,在混合前你必须减lessinput电平。

编辑:对于迟到的input抱歉,但也许这将有助于未来的人: 苹果有一个例子 ,我只是混淆了audio混音器。

如果你在2016年阅读这个,你正在寻找一个迅速2.x的解决scheme – 我得到了你。 我的解决scheme实现了一个闭包,在写入后返回输出文件,避免立即读取一个零字节的文件,因为这个操作是asynchronous操作。 这尤其是通过使用第一轨道的持续时间作为总输出持续时间来重叠两个音轨。

func setUpAndAddAudioAtPath(assetURL: NSURL, toComposition composition: AVMutableComposition, duration: CMTime) { let songAsset: AVURLAsset = AVURLAsset(URL: assetURL, options: nil) let track: AVMutableCompositionTrack = composition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: kCMPersistentTrackID_Invalid) let sourceAudioTrack: AVAssetTrack = songAsset.tracksWithMediaType(AVMediaTypeAudio)[0] var error: NSError? = nil var ok: Bool = false let startTime: CMTime = CMTimeMakeWithSeconds(0, 1) let trackDuration: CMTime = songAsset.duration //CMTime longestTime = CMTimeMake(848896, 44100); //(19.24 seconds) let tRange: CMTimeRange = CMTimeRangeMake(startTime, duration) //Set Volume let trackMix: AVMutableAudioMixInputParameters = AVMutableAudioMixInputParameters(track: track) trackMix.setVolume(1.0, atTime: kCMTimeZero) audioMixParams.append(trackMix) //Insert audio into track try! track.insertTimeRange(tRange, ofTrack: sourceAudioTrack, atTime: CMTimeMake(0, 44100))} func saveRecording(audio1: NSURL, audio2: NSURL, callback: (url: NSURL?, error: NSError?)->()) { let composition: AVMutableComposition = AVMutableComposition() //Add Audio Tracks to Composition let avAsset1 = AVURLAsset(URL: audio1, options: nil) var track1 = avAsset1.tracksWithMediaType(AVMediaTypeAudio) let assetTrack1:AVAssetTrack = track1[0] let duration: CMTime = assetTrack1.timeRange.duration setUpAndAddAudioAtPath(audio1, toComposition: composition, duration: duration) setUpAndAddAudioAtPath(audio2, toComposition: composition, duration: duration) let audioMix: AVMutableAudioMix = AVMutableAudioMix() audioMix.inputParameters = audioMixParams //If you need to query what formats you can export to, here's a way to find out NSLog("compatible presets for songAsset: %@", AVAssetExportSession.exportPresetsCompatibleWithAsset(composition)) let format = NSDateFormatter() format.dateFormat="yyyy-MM-dd-HH-mm-ss" let currentFileName = "recording-\(format.stringFromDate(NSDate()))-merge.m4a" let documentsDirectory = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] let outputUrl = documentsDirectory.URLByAppendingPathComponent(currentFileName) let assetExport = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetAppleM4A) assetExport!.outputFileType = AVFileTypeAppleM4A assetExport!.outputURL = outputUrl assetExport!.exportAsynchronouslyWithCompletionHandler({ audioMixParams.removeAll() switch assetExport!.status{ case AVAssetExportSessionStatus.Failed: print("failed \(assetExport!.error)") callback(url: nil, error: assetExport!.error) case AVAssetExportSessionStatus.Cancelled: print("cancelled \(assetExport!.error)") callback(url: nil, error: assetExport!.error) default: print("complete") callback(url: outputUrl, error: nil) } }) }