快速附加或连接音频文件
Posted
技术标签:
【中文标题】快速附加或连接音频文件【英文标题】:append or concatenate audio files in swift 【发布时间】:2015-03-31 20:59:40 【问题描述】:您好,我想附加语音文件。
我正在用 AVAudioRecorder 录制声音,但要播放录音我需要调用“停止”,但播放后我想继续录音。就像原生 ios 语音备忘录应用一样。
我应该使用 AVMutableCompositionTrack 吗?如何快速做到这一点?谢谢!
【问题讨论】:
【参考方案1】:如果您只想暂停录制并稍后继续录制,您可以使用 AVAudioRecorder 的 pause() 函数而不是 stop(),当您再次使用 play() 时它将继续录制。
但是,如果您想要真正连接音频文件,您可以这样做:
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 into one file
var nextClipStartTime = kCMTimeZero
let composition = AVMutableComposition()
let track = composition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: kCMPersistentTrackID_Invalid)
// Add each track
for 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)
do
try track.insertTimeRange(timeRange, ofTrack: assetTrack, atTime: nextClipStartTime)
nextClipStartTime = CMTimeAdd(nextClipStartTime, timeRange.duration)
catch
print("Error concatenating file - \(error)")
completion(concatenatedFile: nil)
return
// Export the 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
do
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 the 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
【讨论】:
当我尝试将多个音频连接到同一个文件时出现以下错误,例如录制 -> 停止 -> 播放 -> 录制 -> 停止 -> 播放 -> 重复。 FigFormatReaderCreateForStreamReturningResults 在 /Library/Caches/com.apple.xbs/Sources/EmbeddedCoreMedia_Sim/EmbeddedCoreMedia-2765.6/Prototypes/FormatHandlers/FigFormatReader_Common.c:2870 发出 err=-12848 (instantiation.firstFailedAttempt.error) (创建 FormatReader 时出错) >以上是关于快速附加或连接音频文件的主要内容,如果未能解决你的问题,请参考以下文章