2015-03-31 26 views
1

嗨,我想追加语音文件。快速追加或连接音频文件

我录制语音与AVAudioRecorder,但打我需要调用“停止”的记录,但打它后,我想继续记录。就像本机iOS语音备忘录应用程序一样。

我应该使用AVMutableCompositionTrack,我该如何在swift中做到这一点?谢谢!

回答

3

如果您正在寻找简单地暂停录音,并继续它后,你可以使用AVAudioRecorder的暂停()函数,而不是停止(),当您使用播放()再次将继续录制。

但是,如果你正在寻找真正串联音频文件,你可以做这样的:

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 
      } 
     } 
    } 
}