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.