【发布时间】:2016-06-07 13:12:03
【问题描述】:
我在下面创建了合并方法(加入、联合,我不确定哪个是正确的词,我想从 2 个或更多音频中制作 1 个音频,而不是一个接一个,而是一次播放每个音频) .作为输入,我有多个 .wav 格式的音频文件,我希望输出 1 个 .wav 格式。
func merge(audioUrls: [NSURL], resultName : String = "result") {
let resultNameWithExtension = resultName + ".wav"
//Create AVMutableComposition Object.This object will hold our multiple AVMutableCompositionTrack.
let composition = AVMutableComposition()
//create new file to receive data
//let documentDirectoryURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first!
let outputFilePath = NSTemporaryDirectory().stringByAppendingPathComponent(resultNameWithExtension)
let fileDestinationUrl = NSURL(fileURLWithPath: outputFilePath)
print(fileDestinationUrl)
StorageManager.sharedInstance.deleteFileAtPath(NSTemporaryDirectory().stringByAppendingPathComponent(resultNameWithExtension))
var avAssets: [AVURLAsset] = []
var assetTracks: [AVAssetTrack] = []
var timeRanges: [CMTimeRange] = []
for audioUrl in audioUrls {
let compositionAudioTrack:AVMutableCompositionTrack = composition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID:kCMPersistentTrackID_Invalid)
let avAsset = AVURLAsset(URL: audioUrl, options: nil)
avAssets.append(avAsset)
let assetTrack = avAsset.tracksWithMediaType(AVMediaTypeAudio)[0]
assetTracks.append(assetTrack)
let duration = assetTrack.timeRange.duration
let timeRange = CMTimeRangeMake(kCMTimeZero, duration)
timeRanges.append(timeRange)
do {
try compositionAudioTrack.insertTimeRange(timeRange, ofTrack: assetTrack, atTime: kCMTimeZero)
} catch let error as NSError {
print("compositionAudioTrack insert error: \(error)")
}
}
let assetExport = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetPassthrough)!
assetExport.outputFileType = AVFileTypeWAVE
assetExport.outputURL = fileDestinationUrl
assetExport.exportAsynchronouslyWithCompletionHandler({
self.delegate?.assetExportSessionDidFinishExport(assetExport, outputFilePath: outputFilePath)
})
}
我的问题是它不起作用,我不知道为什么。我得到的错误:
错误域=AVFoundationErrorDomain 代码=-11838 “操作已停止” UserInfo={NSLocalizedDescription=操作已停止, NSLocalizedFailureReason=此操作不支持 媒体。})
当我将预设和输出类型更改为 .m4a 时,它可以工作,但我需要 .wav。当我有相同格式的输入时,它应该与 .wav 一起使用,对吗?感谢您的帮助
【问题讨论】:
-
Mixing 或 summing 是音乐世界中合并音频的正确术语。
-
感谢您的信息,所以我需要混合我的音频文件。
-
我过去做过很多测试,但我从来没有能够让 AVAssetExportSession 导出 M4A 文件以外的任何东西。您可能需要为您的任务使用与 AVAssetExportSession 不同的 API。
-
AVMutableAudioMix 有明确的预设,除了 M4A 文件之外不能导出任何东西。我试图回答这个问题,但它没有奏效。并且在使用 AVAssetExportPresetPassthrough 时,它会忽略 audioMix。我努力让事情成功,但没有成功。
-
@EricD 我的任务有不同的 API 吗?可以帮助我的另一个可能的课程是什么?谢谢
标签: ios swift audio avassetexportsession avmutablecomposition