Согласно документу, generateCGImagesAsynchronously
принимает массив NSValue
, генерирует кадры из видео и заданного времени и возвращает его в качестве обратного вызова.
Я генерирую список значений, используя следующиекод
var values : [NSValue] = []
let frameDuration = CMTimeMake(1, timeScale)
for i in 0..<duration{
let lastFrameTime = CMTimeMake(Int64(i), timeScale)
let presentationTime = (i == 0) ? lastFrameTime : CMTimeAdd(lastFrameTime, frameDuration)
values.append(NSValue(time: presentationTime))
//Next two lines of codes are just to cross check the output
let image = try! imageGenerator.copyCGImage(at: presentationTime, actualTime: nil)
let imageUrl = FileManagerUtil.getTempFileName(parentFolder: FrameExtractor.EXTRACTED_IMAGE, fileNameWithExtension: "\(Constants.FRAME_SUFFIX)\(i)\(".jpeg")")
}
Как видно из приведенного выше кода, я перекрестно проверил результат с помощью синхронного метода и могу подтвердить, что массив values
содержит правильную ссылку времени.
Но когда один и тот же массив передается методу generateImageAsynchronously
, я получаю дубликат одного и того же кадра 10 раз для разных временных отметок.То есть, если у меня видео 10 секунд, то я получаю 300 кадров (с 30 кадрами в секунду), но кадры с 1-й секунды повторяются 10 раз каждый.Это похоже на возврат кадра в течение 0,1 секунды при запросе в течение 1 секунды.
PS: хотя синхронный метод работает нормально, он занимает вдвое больше времени, чем асинхронный метод.Может быть потому, что он возвращает те же кадры.Но мне нужно, чтобы он работал для проверки фактического использования времени.