使用AVAssetExportSession合并音频

问题描述

我想合并两个音频文件而不会花费太多时间。以下代码成功地合并了音频,但是花费的时间太长(超过30秒,超过几分钟的音频),我想知道是否有任何方法可以加快该过程。我在几个地方读过使用AVAssetExportPresetPassthrough,但似乎无法使该预设适用于任何文件类型。我唯一可以使用的设置是使用AVAssetExportPresetAppleM4A并导出为.m4a

创建AVAssetExportSession的代码

if (audioHasBeenRecorded) {
  // Merge recordings
  let composition = AVMutableComposition()
  let compositionAudioTrack = composition.addMutableTrack(withMediaType: AVMediaType.audio,preferredTrackID: kCMPersistentTrackID_Invalid)

  guard let start = recorder.timeStart else { return }
  
  compositionAudioTrack?.insert(originalRecording: FileManagerHelper.recordingLocalURL(secondRecording: false),insertedRecording: FileManagerHelper.recordingLocalURL(secondRecording: true),startTime: CMTime(seconds: start,preferredTimescale: 1000000))

  if let assetExport = AVAssetExportSession(asset: composition,presetName: AVAssetExportPresetAppleM4A) {
    print(assetExport.supportedFileTypes)
    assetExport.outputFileType = AVFileType.m4a
    assetExport.outputURL = FileManagerHelper.recordingLocalURL(secondRecording: false)
    do { // Delete old audio
        try FileManager.default.removeItem(at: FileManagerHelper.recordingLocalURL(secondRecording: false))
        try FileManager.default.removeItem(at: FileManagerHelper.recordingLocalURL(secondRecording: true))
    } catch { log(error.localizedDescription,msgType: .error) }
   
    assetExport.exportAsynchronously(completionHandler: {
      if let error = assetExport.error {
        log(error,msgType: .error)
      } else {
        log("Successfully merged recordings!",msgType: .error)
        self.idea.numberOfPoints = self.audioVisualizer.count
        self.idea.save()
        
        self.setupPlayer() // Prepare to play the recorded audio file
        self.seekTo(TimeInterval((recorder.timeStart ?? 0) + (recorder.timeEnd ?? 0)))
        dispatchQueue.main.async { [ weak self ] in
          guard let self = self else { return }
          self.audioVisualizer.visualize(self.idea)
        }
      }
    })
  }
}

插入代码

extension AVMutableCompositionTrack {
  func insert(originalRecording: URL,insertedRecording: URL,startTime: CMTime) {
    let originalAsset = AVURLAsset(url: originalRecording)
    let insertedAsset = AVURLAsset(url: insertedRecording)

    let range1 = CMTimeRangeMake(start: CMTime.zero,duration: startTime)
    let range2 = CMTimeRangeMake(start: CMTime.zero,duration: insertedAsset.duration)
    let range3 = CMTimeRangeMake(start: startTime + insertedAsset.duration,duration: originalAsset.duration - startTime)
    if let originalTrack = originalAsset.tracks(withMediaType: AVMediaType.audio).first,let insertedTrack = insertedAsset.tracks(withMediaType: AVMediaType.audio).first {
         try? insertTimeRange(range1,of: originalTrack,at: CMTime.zero)
         try? insertTimeRange(range2,of: insertedTrack,at: startTime)
         try? insertTimeRange(range3,at: startTime + insertedAsset.duration)
    }
  }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)