Моя цель - довольно точно обрезать звук. При экспорте с использованием AVAssetExportSession возникла странная проблема.
Код довольно прост.
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")")
}
}
Когда я начал анализировать результаты в Audacity, я вижу, что файл обрезан с помощью некоторая ошибка, которая очень критична.
![Aligned by time](https://i.stack.imgur.com/9RpVq.png)
Если выровнять ее по пикам (на глаз), я вижу ошибку ~ 500 мс в данном конкретном случае. Ошибка меняется и повторяется для разных файлов, которые я пробовал.
![Aligned by peaks](https://i.stack.imgur.com/z6Bbd.png)
Я пробовал это с AVMutableComposition. Тот же результат.
Может я что-то не так делаю? Или я что-то упустил? Я хочу, чтобы файлы были обрезаны точно к тому времени, когда я установил свойство timeRange AVAssetExportSession.