AVAssetExportSession trims audio with some error

Hi there!


My goal is to trim audio quite precisely. I'm facing some strange issue when exporting it using AVAssetExportSession.

The code is pretty straightforward.


import UIKit
import AVFoundation
import PlaygroundSupport

let asset: AVURLAsset = AVURLAsset(url: Bundle.main.url(forResource: "tmp", withExtension: "aac")!)
print(asset)

let timeRange = CMTimeRange(
  start: CMTime(seconds: 20.0, preferredTimescale: asset.duration.timescale),
  end: CMTime(seconds: 25.0, preferredTimescale: asset.duration.timescale)
)

let exportSession = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetPassthrough)!
exportSession.outputFileType = .m4a

let fm = FileManager.default
let tmpDirURL = FileManager.default.temporaryDirectory.appendingPathComponent("cut.m4a")

try? fm.removeItem(at: tmpDirURL)

exportSession.outputURL = tmpDirURL
print(tmpDirURL)

exportSession.timeRange = timeRange

exportSession.exportAsynchronously {
  switch exportSession.status {
  case .completed:
  print("completed")
  default:
  print("exportSession: \(exportSession.error?.localizedDescription ?? "error")")
  }
}


When I started analyzing results in the Audacity, I see that file is trimmed with some error which is very critical.



If I align it by peaks (on the eye) I see ~500 ms error in this particular case. Error varies and repeats for different files I've tried.



I've tried it with AVMutableComposition. Same result.

Maybe I'm doing something wrong? Or am I missing something? I want files to be cut exactly by the time I set timeRange property of AVAssetExportSession.

I'm seeing the same thing. I see you've asked your question a year ago. Were you able to fix your issue since then?

AVAssetExportSession trims audio with some error
 
 
Q