AVAssetExportSession обрезает звук с некоторой ошибкой - PullRequest
1 голос
/ 19 марта 2020

Моя цель - довольно точно обрезать звук. При экспорте с использованием 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

Если выровнять ее по пикам (на глаз), я вижу ошибку ~ 500 мс в данном конкретном случае. Ошибка меняется и повторяется для разных файлов, которые я пробовал.

Aligned by peaks

Я пробовал это с AVMutableComposition. Тот же результат.

Может я что-то не так делаю? Или я что-то упустил? Я хочу, чтобы файлы были обрезаны точно к тому времени, когда я установил свойство timeRange AVAssetExportSession.

...