快速附加或连接音频文件

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 时出错) >

以上是关于快速附加或连接音频文件的主要内容,如果未能解决你的问题,请参考以下文章

检测连接的音频设备 iOS

快速从音频文件中删除音频通道

如何使用附加模式将音频录制到现有的音频文件中?

将一个 AAC 文件附加到另一个文件时输出音频设置

如何将系统麦克风音频流传输到附加设备的麦克风音频流

如何编辑或附加录音?