Получить последний кадр из видео

Я пытаюсь получить последний кадр из видео. Последний кадр, а не последняя секунда (потому что у меня очень быстрые видео, в одной секунде могут быть разные сцены).

Я написал такой код для тестирования:

private func getLastFrame(from item: AVPlayerItem) -> UIImage? {
    let imageGenerator = AVAssetImageGenerator(asset: item.asset)

    imageGenerator.requestedTimeToleranceAfter = kCMTimeZero
    imageGenerator.requestedTimeToleranceBefore = kCMTimeZero

    let composition = AVVideoComposition(propertiesOf: item.asset)
    let time = CMTimeMakeWithSeconds(item.asset.duration.seconds, composition.frameDuration.timescale)

    do {
        let cgImage = try imageGenerator.copyCGImage(at: time, actualTime: nil)
        return UIImage(cgImage: cgImage)
    } catch {
        print("\(error)")
        return nil
    }
}

Но я всегда получаю такую ​​ошибку, когда пытаюсь ее выполнить:

Домен=AVFoundationErrorDomain Code=-11832 "Cannot Open" UserInfo={NSUnderlyingError=0x170240180 {Error Domain=NSOSStatusErrorDomain Code=-12431 "(null)"}, NSLocalizedFailureReason=Этот носитель нельзя использовать., NSLocalizedDescription=Не удается открыть}

Если я уберу requestedTimeTolerance (так что по умолчанию это будет бесконечное значение), все в порядке, но я всегда получаю более яркое изображение, чем в видео (может быть, это потому, что был захвачен не последний кадр? Или у преобразования CGImage → UIImage есть проблемы?)

Вопросы:

  1. Почему я получаю сообщение об ошибке, когда указан нулевой допуск? Как получить именно последний кадр?
  2. Почему захваченные изображения могут быть слишком яркими, чем в видео? Например, если я пишу такой код:

    self.videoLayer.removeFromSuperlayer()
    self.backgroundImageView.image = getLastFrame(from: playerItem)
    

Вижу "скачок яркости" (видео было темнее, изображение ярче).

Обновление 1

Я обнаружил связанную проблему: AVAssetImageGenerator не копирует изображение, но этот вопрос не решен.


person Vasily    schedule 21.04.2017    source источник
comment
Вы проверили это? stackoverflow.com/a/42967138/620665   -  person Paramasivan Samuttiram    schedule 21.04.2017
comment
@ Василий, я вижу то же самое с более ярким изображением. Это действительно очень странно. То же самое и для первого кадра видео.   -  person simplexity    schedule 05.05.2017
comment
Кроме того, я также не могу получить самый последний кадр. Это всегда занимает, возможно, несколько миллисекунд ДО последнего кадра.   -  person simplexity    schedule 05.05.2017
comment
@Василий, ты нашел решение?   -  person Zღk    schedule 09.11.2019